Как получить название дня недели из даты?

#oracle #date #dayofweek

#Oracle #Дата #день недели

Вопрос:

Учитывая 03/09/1982 , как мы можем сказать, какой день недели. В этом случае это будет Tue .

Возможно ли получить в одном запросе?

Ответ №1:

 SQL> SELECT TO_CHAR(date '1982-03-09', 'DAY') day FROM dual;

DAY
---------
TUESDAY

SQL> SELECT TO_CHAR(date '1982-03-09', 'DY') day FROM dual;

DAY
---
TUE

SQL> SELECT TO_CHAR(date '1982-03-09', 'Dy') day FROM dual;

DAY
---
Tue
  

(Обратите внимание, что в запросах используются литералы даты ANSI, которые соответствуют стандарту даты ISO-8601 и позволяют избежать неоднозначности формата даты.)

Комментарии:

1. Имейте в виду, что ‘дд / мм / гггг’ в приведенных выше примерах кода нетипичен, если вы собираетесь использовать форматирование даты в США. В США типичным форматом даты был бы ‘мм / дд / гггг’. Неясно, был ли исходный пример даты в марте или в сентябре.

2. Нетипичный? @DWright вы, должно быть, из США и никогда не работали над международным проектом или слышали о международных стандартах (ISO)

3. @pablete, я на самом деле вырос в Европе и осведомлен о международных различиях в форматировании даты, а также о стандартах ISO. Причина, по которой я сделал этот комментарий, заключается в том, что OP явно использовал формат даты в США, поскольку 9 марта 1982 года был вторник, а 3 сентября 1982 года была пятница. OP говорит, что это был вторник, поэтому мы знаем, что используется форматирование даты в США. Но Zohaib использует строку формата ‘дд / мм / гггг’, что создает потенциальную проблему, если OP использует строку формата Zohaib, поскольку это не форматирование США. Итак, я хотел просто предупредить людей, и особенно OP, об этом.

4. Назовите меня сумасшедшим, но я бы добавил и использовал select to_char(date '1982-03-09', 'Day') day from dual; . Понятия не имею, почему люди так любят заглавные буквы, поскольку теперь у нас есть подсветка синтаксиса, а заглавные буквы занимают больше места, когда не используются шрифты фиксированной ширины.

Ответ №2:

Опоздание на вечеринку почти на десять лет, но я думаю, что необходимо улучшить ответ @Zohaib, поскольку результат зависит от языка клиента. Если вы показываете название дня недели пользователю, это абсолютно нормально, но если ваш код зависит от этого, я бы предпочел управлять языком следующим образом:

 SQL> SELECT TO_CHAR(date '1982-03-09', 'DAY', 'NLS_DATE_LANGUAGE = ENGLISH') day FROM dual;

DAY
---------
TUESDAY

SQL> SELECT TO_CHAR(date '1982-03-09', 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') day FROM dual;

DAY
---
TUE

SQL> SELECT TO_CHAR(date '1982-03-09', 'Dy', 'NLS_DATE_LANGUAGE = ENGLISH') day FROM dual;

DAY
---
Tue
  

Ответ №3:

Чтобы сделать это в Oracle sql, я попробовал вот так, и у меня это сработало

 SELECT 
    START_DATE,
    CASE WHEN START_DAY = 7 THEN 'SUNDAY'
         WHEN START_DAY = 1 THEN 'MONDAY'
         WHEN START_DAY = 2 THEN 'TUESDAY'
         WHEN START_DAY = 3 THEN 'WEDNESDAY'
         WHEN START_DAY = 4 THEN 'THURSDAY'
         WHEN START_DAY = 5 THEN 'FRIDAY'
         WHEN START_DAY = 6 THEN 'SATURDAY'
    END DAY_NAME
FROM 
(SELECT 
    TO_CHAR(T.START_DATE, 'DY') START_DAY,
    TO_CHAR(T.START_DATE, 'MM/DD/YYYY') START_DATE
       
FROM 
    TABLE T )