2010-08-10 146 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