2010-08-10 74 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) – 2014-04-28 14:48:43

回答

22

從Oracle 11g開始,是的。我見過的唯一可行的區域無關的替代方法是如下:

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

爲什麼Julian日實際工作? – 2015-09-09 09:12:04

+1

@ Michael-O - 因爲Julian日期基本上是一個固定的已知時間點以來的天數,因此您可以使用基本的數學運算來確定它是否是週末,因爲您已經知道每週的哪一天1是。由於其他日曆的月份長度,年份,閏年和閏年有所不同,因此在給定單個日期的情況下,獲取其他日曆的一週中的某日信息會更加困難。 – ninesided 2015-09-14 07:52:13

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 2010-08-10 16:28:56

+0

確實並接受。我強烈要求回答這個問題,只是增加了更多信息。你的回答確實解決了這個問題。 – Guru 2010-08-11 17:13:28

1

集NLS_TERRITORY前

alter session set NLS_TERRITORY=SWEDEN; 

所以你知道哪個號碼是週末

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

是不正確的! 根據NLS設置,週末日的天數可能是6 & 7或7和1。

所以適當的測試(不論NLS-設置)這是一個之前提到的:

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

我認爲你在這裏可能不正確,'J'格式表示Julian日期,自固定時間點以來的天數,並且完全獨立於NLS設置。請參閱此文章以供參考:http://en.wikipedia.org/wiki/Julian_day#Finding_day_of_week_given_Julian_day_number – ninesided 2013-10-09 09:03:04

1

在我看來,最好的選擇是

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

+0

如果您認同別人,您應該注意他們,不要添加重複的代碼。 – 2014-03-27 21:36:57