SQL检查星期几

时间:2018-09-09 19:16:31

标签: sql oracle

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

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

 TO_CHAR(SYSDATE,'D')

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

3 个答案:

答案 0 :(得分:1)

Semaphore semaphore = new Semaphore(0); semaphore.acquire(10); // you are blocked here 是伪列。您无需查询,可以直接对其进行评估:

Semaphore semaphore = new Semaphore(0);
System.out.println(semaphore.tryAcquire(10)); // false

答案 1 :(得分:1)

请勿为此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

相反,您可以使用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加1。

答案 2 :(得分:0)

这是可重用函数中的逻辑,但突然问到“是工作日吗?” (不是周末)。您可以为工作日的开始日期添加一个参数(Oracle中的默认值为2;星期日为第一天)。

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