[英]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_CHAR
与D
格式模型一起使用,因为它取决于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
。
相反,您可以使用TRUNC
和IW
格式模型:
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.