【问题标题】:Determine if Oracle date is on a weekend?确定 Oracle 日期是否在周末?
【发布时间】:2011-03-27 22:18:49
【问题描述】:

这是确定 Oracle 日期是否在周末的最佳方法吗?

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

【问题讨论】:

  • 实际上并非所有国家的周末都是周六/周日,少数(20-30)个国家在不同的日子有周末(来源:en.wikipedia.org/wiki/Workweek_and_weekend)跨度>

标签: oracle date plsql weekend


【解决方案1】:

我认为最好的选择是

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

【讨论】:

  • 如果您同意其他人的观点,您应该为他们投票,而不是添加重复的代码。
【解决方案2】:
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')

【讨论】:

  • 我觉得你这里可能不对,J 格式代表儒略日期,从一个固定时间点算起的天数,完全独立于 NLS 设置。参考这篇文章:en.wikipedia.org/wiki/…
【解决方案3】:

在之前设置 NLS_TERRITORY

alter session set NLS_TERRITORY=SWEDEN;

所以你确定哪些数字是周末

【讨论】:

    【解决方案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 函数。

    【讨论】:

    • 这些都不能解决问题,第一个很危险,因为“星期几”取决于地区,例如:1 = 美国是星期日,英国是星期一。
    • 正确并被接受。而且我声称要回答这个问题,只是添加了更多信息。您的回答确实解决了问题。
    【解决方案5】:

    从 Oracle 11g 开始,是的。我见过的唯一可行的与区域无关的替代方案如下:

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

    【讨论】:

    • @Michael-O - 因为朱利安日期基本上是自固定的已知时间点以来的天数,您可以使用基本数学来确定是否是周末,因为您已经知道第 1 天是星期几。由于其他日历具有不同的月长、年长、闰日和闰年,因此在使用单一日期的情况下,更难以为其他日历获取有关星期几的信息。
    • to_char(my_date, 'd') 不成功吗?为什么使用'J'MOD
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多