如何检查是否是SQL的周末?
我知道我可以使用这个将sysdate
转换为数字
SQL> select to_char(sysdate, 'd') from dual;
TO_CHAR(SYSDATE,'D')
但是我不太确定如何检查今天是6还是7。
答案 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
。
相反,您可以使用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加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