繁体   English   中英

SQL检查星期几

[英]SQL check day of week

如何检查它是否是SQL的周末? 我知道我可以使用sysdate转换为数字

 SQL> select to_char(sysdate, 'd') from dual;

 TO_CHAR(SYSDATE,'D')

但我不确定如何检查今天是6还是7。

sysdate是一个伪列。 您不需要查询它,您可以直接评估它:

IF TO_CHAR(SYSDATE, 'D') IN ('6', '7') THEN
    -- Do something
END IF;

我会避免模糊的'D'格式,因为这在不同地区之间会有所不同(周末从我住的周末开始)和使用

if to_char(sysdate,'fmDY','nls_date_language=English') like 'S%'
then

关于'D'格式,遗憾的是to_char不允许您指定内联的nls_territory ,因此如果没有显式的alter session命令,它将依赖于运行时的会话设置。 我已经看到了生产错误,其中相同的代码在伦敦工作但在纽约失败了。

不要将TO_CHARD格式模型一起使用,因为它取决于NLS_TERRITORY会话参数。

例如,当SYSDATE = 2018-09-10 (星期一)时:

ALTER SESSION SET NLS_TERRITORY = 'France';
SELECT TO_CHAR( SYSDATE, 'D' ) FROM DUAL;

在不同的区域输出1但相同的查询:

ALTER SESSION SET NLS_TERRITORY = 'America';
SELECT TO_CHAR( SYSDATE, 'D' ) FROM DUAL;

输出2

相反,您可以使用TRUNCIW格式模型:

SELECT TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ) FROM DUAL

星期一输出0 (星期二输出1 ,星期日输出6 )并且与NLS_TERRITORY设置无关。

所以你可以过滤这个周末作为:

SELECT *
FROM   DUAL
WHERE  TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ) IN ( 5, 6 )

要么

SELECT *
FROM   DUAL
WHERE  SYSDATE - TRUNC( SYSDATE, 'IW' ) >= 5

如果您希望将1天的索引与TO_CHAR的预期输出(而不是0索引)保持一致,那么只需将值加1即可。

这是可重复使用功能的逻辑,但却翻过来问“这是一个工作日吗?” (不是周末)。 您可以为工作日的开始日添加参数(2是Oracle中的默认值;星期日是第1天)。

CREATE OR REPLACE FUNCTION is_weekday (date_in IN DATE) 
   RETURN BOOLEAN 
IS 
BEGIN 
   RETURN TO_CHAR (date_in, 'D') BETWEEN 2 AND 6; 
END; 
/

DECLARE 
   l_date   DATE := DATE '2018-09-10'; 
BEGIN 
   DBMS_OUTPUT.put_line ('If your weekend is Saturday and Sunday....'); 

   FOR indx IN 1 .. 7 
   LOOP 
      DBMS_OUTPUT.put_line ( 
            TO_CHAR (l_date, 'FMDay, Month DD YYYY') 
         || ' is ' 
         || CASE WHEN NOT is_weekday (l_date) THEN 'not ' END 
         || 'a weekday'); 
      l_date := l_date + 1; 
   END LOOP; 
END; 
/

在LiveSQL中试用: https ://livesql.oracle.com/apex/livesql/file/content_G8NQSY6NP48NPJX96RLQ51SUE.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM