#sql #oracle11g
#sql #oracle11g
Вопрос:
У меня ситуация, когда мне нужно сохранить день и дату (просто дату) в одном столбце в Oracle, как показано ниже:
Column name
Monday
Tuesday
25
10
Но мне не нравится объединять строку и число в одном столбце. Итак, я хочу любую формулу или дизайн, где каждое из этих значений получает уникальный идентификатор и сохраняется, как показано ниже:
Column name
1 - - - - - refers to Monday
2............refers Tuesday
3-----------refers to a actual date 1
Выше приведены воображаемые значения только для понимания.
Что мне нужно, так это если мне нужно получить все записи со значением Monday, я должен применить некоторую формулу и получить число, которое я должен использовать в запросе select
Таким же образом, если я хочу выбрать записи с date = 25, тогда я должен применить ту же формулу и получить уникальный номер, который представляет дату 25, и использовать его в моем запросе
Комментарии:
1. Поскольку все в замешательстве, я добавляю еще один момент, что я не могу присвоить этому столбцу тип даты или штамп даты…. Это числовой тип…. Итак, я хочу хранить даты как число и день недели также как некоторое число..
2. И почему 3 не относится к среде?
3. Пример, который вы видите, — это просто выдумка, я могу отнести 3 к среде …. 4 к четвергу …… 5 к пятнице, 6 к сб и 7 к вс….. Но что мне следует сохранить, если я получу фактическую дату 1,2,3,4,5,6,7, поскольку они сопоставлены дням, если сохранить эти значения, похоже, что в этих записях указаны дни недели, но этого не должно произойти….
4. Вы не можете хранить эту информацию в одном столбце. Для этого вам нужны два столбца. Или использовать один столбец, определенный как
date
5. Даже если вы найдете такую формулу, это нарушает основные принципы хорошего проектирования базы данных. Просто добавьте второй столбец и покончите с этим. Это будет намного более гибким и эффективным в долгосрочной перспективе.
Ответ №1:
Хранить только ДАТУ в столбце, день недели является производным от этого.
итак:
CREATE TABLE junk
(
id number,
my_date date
);
insert into junk values ( 123, sysdate );
insert into junk values ( 234, add_months(sysdate,-123) );
commit;
select my_date "The actual date",
to_char(my_date,'Day') "The day of the week",
to_char(my_date,'Dy') "other way",
to_char(my_date,'D') "another way"
from junk;
The actual date The day o oth a
-------------------- --------- --- -
27-mar-2019 15:28:15 Wednesday Wed 4
27-dec-2008 15:28:15 Saturday Sat 7
2 rows selected.
Пытаясь сделать что-то большее, чем это, вы, скорее всего, только навредите себе в долгосрочной перспективе (подумайте, как вы будете поддерживать вещи, если что-то будет обновлено .. подумайте, что произойдет, если / когда кто-то «случайно» обновит 1 из значений, не обновляя соответствующее? … потому что они этого не понимали … )
-- only pull records on Wednesday
select *
from junk
where to_char(my_date,'D') = 4
/
ID MY_DATE
---------- --------------------
123 27-mar-2019 15:28:15
1 row selected.
Комментарии:
1. Я не могу присвоить этому столбцу тип даты, как я упоминал….. Я должен хранить только число… И мне не нужен месяц и все такое…. Просто дата и день недели все должны быть уникальными…. Я ищу какую-то формулу, которая даст мне уникальное значение для понедельника и уникальное значение для даты
2. @premkumar: «дата» уже определяет день недели. Зачем вам хранить это с избытком?
3. Это не является избыточным, некоторые записи будут иметь дату в качестве значения, а некоторые записи будут иметь день недели в качестве значений из источника, который я получаю…. Но я не хочу объединять строку и число…. Я просто хочу сопоставить все даты с некоторыми уникальными числами и весь день недели с уникальным номером
4. @premkumar еще раз, мы говорим вам не делать этого таким образом. Сохранить дату.. и ВСЯ эта информация (плюс еще кое — что) у вас под рукой … хранить это любым другим способом неразумно или нецелесообразно … извините, пожимаю плечами
5. @premkumar упускает суть .. если он не так часто используется, почему бы просто не создать его «правильно» и просто? зачем пытаться перепроектировать его с помощью чрезмерно сложного дизайна, который не нужен?
Ответ №2:
Вы можете использовать функцию to_char() в oracle:
SELECT TO_CHAR(date '2019-03-27', 'DAY') day FROM dual;
Который вернет день недели.
Комментарии:
1. если я получу 1 в качестве дня недели для понедельника, тогда 1 представляет понедельник, тогда как насчет фактической даты 1, как бы я ее сохранил