Определить, приходится ли свидание Oracle на выходные?

Это лучший способ определить, приходится ли свидание Oracle на выходные?

select * from mytable
where 
TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN');

person Marcus Leon    schedule 10.08.2010    source источник
comment
На самом деле уик-энд - это не суббота / воскресенье во всех странах, в некоторых (20-30) странах выходные дни проходят в разные дни (источник: en.wikipedia.org/wiki/Workweek_and_weekend)   -  person nt_1    schedule 28.04.2014


Ответы (5)


Что касается Oracle 11g, да. Единственная жизнеспособная независимая от региона альтернатива, которую я видел, следующая:

SELECT *
FROM mytable
WHERE MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7);
person ninesided    schedule 10.08.2010
comment
@ Michael-O - поскольку даты по юлианскому календарю - это, по сути, количество дней, прошедших с фиксированного известного момента времени, вы можете использовать базовую математику, чтобы определить, были ли это выходные или нет, потому что вы уже знаете, какой день недели 1 было. Поскольку другие календари имеют разную длину месяца, длину года, високосные дни и високосные годы, сложнее получить информацию о дне недели для других календарей, учитывая единственную дату для работы. - person ninesided; 14.09.2015
comment
to_char(my_date, 'd') не помогает? зачем использовать 'J' и MOD? - person towi; 23.05.2019

Не ответ на вопрос. Но еще немного информации. Есть еще много трюков SQL с датой.

to_char(sysdate, 'd') --- day of a week, 1,2,3 .. to 7
to_char(sysdate, 'dd') --- day of a month, 1,2,3 .. to 30 or 31
to_char(sysdate, 'ddd') --- day of a year, 1,2,3 .. to 365 or 366
to_char(sysdate, 'w') --- week of a month, 1,2,3,4 or 5
to_char(sysdate, 'ww') --- week of a year, 1,2,3 .. to 52

Подробнее здесь: функция to_char.

person Guru    schedule 10.08.2010
comment
ни один из них не решает проблему, первый опасен, поскольку день недели зависит от региона, например: 1 = воскресенье в США, понедельник в Великобритании. - person ninesided; 10.08.2010
comment
Верно и принято. И я не претендую на ответ на этот вопрос, просто добавил дополнительную информацию. Ваш ответ решил проблему. - person Guru; 11.08.2010

MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7)

не является правильным! Количество выходных дней может быть 6 и 7 или 7 и 1, в зависимости от настроек NLS.

Итак, ПРОПОРТНЫЙ тест (независимо от настроек NLS) - это уже упомянутый ранее:

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN')
person Jan-Hendrik van Heusden    schedule 19.12.2012
comment
Я думаю, что вы здесь ошибаетесь, формат J представляет дату по юлианскому календарю, количество дней, прошедших с фиксированного момента времени, и полностью не зависит от настроек NLS. См. Эту статью для справки: en.wikipedia.org/wiki/ - person ninesided; 09.10.2013

На мой взгляд лучший вариант - это

TO_CHAR (my_date, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN')

person Victor    schedule 27.03.2014
comment
Если вы согласны с кем-то другим, вы должны проголосовать за него, а не добавлять повторяющийся код. - person Jon Heller; 28.03.2014

установить NLS_TERRITORY перед

alter session set NLS_TERRITORY=SWEDEN;

Итак, вы уверены, какие числа выходные

person Joakim    schedule 06.09.2012