2010-08-10 2 views
12

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

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

На самом деле конец недели не суббота/Воскресенье во всех странах, несколько (20-30) стран имеют выходные в разные дни (источник: en.wikipedia.org/wiki/Workweek_and_weekend) –

ответ

22

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

SELECT * 
FROM mytable 
WHERE MOD(TO_CHAR(my_date, 'J'), 7) + 1 IN (6, 7); 
+0

Почему на самом деле работает юлианский день? –

+1

@ Michael-O - потому что юлианские даты - это в основном количество дней с момента фиксированного, известного момента, когда вы можете использовать основные математические данные, чтобы определить, был ли это выходной или нет, потому что вы уже знаете, какой день недели 1 был. Поскольку другие календари имеют разную длину месяца, длину года, високосные и високосные годы, сложнее получить информацию о дне недели для других календарей, учитывая единую дату для работы. – ninesided

4

Не ответ на вопрос. Но еще немного информации. Есть еще много трюков 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 функция.

+7

Ни один из них не решает проблему, первый опасен, поскольку «день недели» зависит от региона, например: 1 = воскресенье в США, понедельник в Великобритании. – ninesided

+0

Истинный и принятый. И я не претендую на то, чтобы ответить на вопрос, просто добавил дополнительную информацию. Ваш ответ разрешил проблему. – Guru

1

набор NLS_TERRITORY перед тем

alter session set NLS_TERRITORY=SWEDEN; 

Таким образом, вы уверены, какие номера в выходные дни

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

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

Так PROPER тест (независимо от NLS-установок) это один упоминалось ранее:

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

Я думаю, что здесь вы можете быть неверными, формат 'J' представляет собой юлианскую дату, количество дней с момента фиксированной точки и полностью не зависит от настроек NLS. См. Эту статью для справки: http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided

1

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

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

+0

Если вы согласны с кем-то другим, вы должны их перенести, а не добавлять повторяющийся код. –

Смежные вопросы