我正在嘗試處理 where 子句中有日期選擇的查詢,即如果 sysdate 是星期一,我必須獲取星期一到星期六的日期以及早上 08:00:00 到第二天早上 07:00 之間的時間:上午 00 點。我在 where 子句中硬編碼日期和時間,當我運行查詢資料時不顯示。
詢問:
SELECT TO_CHAR(sysdate, 'HH24:MI:SS'), REPLACE(TO_CHAR(sysdate, 'DAY'), ' ')
FROM dual
WHERE TO_CHAR(sysdate, 'HH24:MI:SS') BETWEEN '08:01:00' AND '08:00:00'
AND TO_CHAR(sysdate, 'DAY') >= 'MONDAY'
AND TO_CHAR(sysdate, 'DAY') <= 'SATURDAY';
uj5u.com熱心網友回復:
您需要先過濾更廣泛的范圍(如果我理解正確,從周一上午 8 點到周六結束),然后排除從上午 7 點到上午 8 點的時間。
在下面的代碼中iw,格式元素代表 ISO 周,從星期一開始。
with a as ( select date '2022-04-17' interval '01:30:00' hour to second interval '2' hour * level as dt from dual connect by level < 90 ) select to_char(dt, 'yyyymmdd') as day_ , listagg(to_char(dt, 'hh24:mi'), ',') within group (order by dt asc) as hours from a where 1 = 1 /*From Mon 08 AM*/ and dt > trunc(dt, 'iw') interval '8' hour /*Till Sat end of the day*/ and dt < trunc(dt, 'iw') 6 /*and except minutes between 7 and 8 AM*/ and not ( to_char(dt, 'hh24mi') < '0800' and to_char(dt, 'hh24mi') > '0700' ) group by to_char(dt, 'yyyymmdd')DAY_ | 小時 :------- | :------------------------------------------------ --------------- 20220418 | 09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30 20220419 | 01:30,03:30,05:30,09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30 20220420 | 01:30,03:30,05:30,09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30 20220421 | 01:30,03:30,05:30,09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30 20220422 | 01:30,03:30,05:30,09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30 20220423 | 01:30,03:30,05:30,09:30,11:30,13:30,15:30,17:30,19:30,21:30,23:30
db<>在這里擺弄
uj5u.com熱心網友回復:
(如果 sysdate 不是星期一呢?)
因此,您能否更好地解釋一下什么是輸入(日期?一個日期?SYSDATE?)以及所需的輸出(與該輸入相關)。
基本上,我不明白你想要什么。同時,您犯的錯誤(如果有幫助的話)。
格式模型錯誤;這就是你所做的:
SQL> select to_char(sysdate, 'DAY') day, length(to_char(sysdate, 'DAY')) len from dual;
DAY LEN
--------- ----------
FRIDAY 9
"FRIDAY" 沒有 9 個字符;它有 6 個 --> 使用fm格式修飾符(它會截斷尾隨空格):
SQL> select to_char(sysdate, 'fmDAY') day, length(to_char(sysdate, 'fmDAY')) len from dual;
DAY LEN
--------- ----------
FRIDAY 6
SQL>
今天(22.04.2022)是星期五。您的查詢搜索日期介于“MONDAY”和“SATURDAY”之間的資料。當您比較字串時,字母表為 [A, B, ..., F , G, ..., M , N, ..., S , T],“F(riday)” 永遠不會在 M 之間(onday) 和 S(aturday) 所以它作業的可能性為零。
截至時間:08:01 和 08:00 之間究竟是哪個時間?時間不會倒退(除非您的意思是“今天 08:01 和明天 08:00”)。
uj5u.com熱心網友回復:
如果 sysdate 是星期一,我必須獲取星期一到星期六的日期以及早上 08:00:00 AM 到第二天早上 07:00:00 AM 之間的時間。
您可以SYSDATE通過將日期與 ISO 周的開始(始終是星期一的午夜)進行比較來確定是否是星期一:
SELECT *
FROM DUAL
WHERE SYSDATE - TRUNC(SYSDATE, 'IW') < 1
您可以通過減去 8 小時并找出時間是否在 00:00 和 23:00 之間來確定時間是否在第二天的 08:00 和 07:00 之間:
SELECT *
FROM DUAL
WHERE (SYSDATE - INTERVAL '8' HOUR) - TRUNC(SYSDATE - INTERVAL '8' HOUR)) DAY TO SECOND
<= INTERVAL '23' HOUR;
您可以將這兩者結合起來,以確定日期是否在周一和周六之間,以及時間是否在第二天的 08:00 和 07:00 之間(因此對于周六,它將包括周日的 7 個小時),使用:
SELECT *
FROM DUAL
WHERE (SYSDATE - INTERVAL '8' HOUR) - TRUNC(SYSDATE - INTERVAL '8' HOUR), 'IW') < 6
AND (SYSDATE - INTERVAL '8' HOUR) - TRUNC(SYSDATE - INTERVAL '8' HOUR)) DAY TO SECOND
<= INTERVAL '23' HOUR;
注意:這不使用TO_CHAR,因此它不受對NLS_TERRITORY或NLS_DATE_LANGUAGE會話引數的任何更改的影響,因此它將始終給出相同的答案(獨立于運行查詢的用戶的設定)。
uj5u.com熱心網友回復:
你可以使用這樣的組合
SELECT TO_CHAR(dt,'HH24:MI:SS','NLS_DATE_LANGUAGE=English') AS Hour,
TO_CHAR(dt,'Day','NLS_DATE_LANGUAGE=English') AS day
FROM t
WHERE TO_CHAR(dt,'Dy','NLS_DATE_LANGUAGE=English') IN ('Tue','Wed','Thu','Fri')
AND TO_CHAR(dt, 'HH24:MI:SS') NOT BETWEEN '07:00:01' AND '08:00:00'
OR TO_CHAR(dt,'Dy','NLS_DATE_LANGUAGE=English') = 'Mon'
AND TO_CHAR(dt, 'HH24:MI:SS')>= '07:00:00'
OR TO_CHAR(dt,'Dy','NLS_DATE_LANGUAGE=English') = 'Sat'
AND TO_CHAR(dt, 'HH24:MI:SS')<= '08:00:00'
需要考慮單獨限制系結日期的期限
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461890.html
