我的 SELECT from Oracle 中有以下查詢:
CASE
WHEN to_char(ola.promise_date, 'D') = 2 THEN (ola.promise_date - 4)
WHEN to_char(ola.promise_date, 'D') = 3 THEN (ola.promise_date - 4)
WHEN to_char(ola.promise_date, 'D') > 3 AND to_char(ola.promise_date, 'D') < 7 THEN (ola.promise_date - 2)
WHEN to_char(ola.promise_date, 'D') = 7 THEN (ola.promise_date - 2)
WHEN to_char(ola.promise_date, 'D') = 1 THEN (ola.promise_date - 2)
END mod_Promise_date
"ola.promise_date" 是一個 TIMESTAMP 型別的列,我使用 CASE 陳述句來調整日期,考慮到原始承諾日期的星期幾(因為內部考慮裝運等)所以,例如,承諾日期為 2021-11-07 00:00:00.0000000 的承諾日期將修改為 2021-11-05 00:00:00.0000000(將周日視為第七天)
現在,我用一個用 C# 制作的程式運行這個查詢,我有一個日期選擇器來選擇特定的承諾日期,所以用戶可以選擇 2021 年 11 月 7 日星期日,它會像之前說的那樣運行查詢,這是有效的很好,除了類似于 2021-11-07 23:59:00.0000000 的承諾日期,因為查詢會將日期視為 11 月 8 日而不是 7 日,這不是預期的行為,因為小時、分鐘、秒在這個特定的專案實體中,并不真正需要小數秒。
有沒有辦法忽略 CASE-WHEN 陳述句中的小時、分鐘、秒和小數秒?或者將日期降低到指定日期的同一天考慮所有事情,而不考慮時間。
我是使用 Oracle 的新手,如果我不夠清楚或者查詢看起來不可行,那么抱歉。
uj5u.com熱心網友回復:
您可以使用TRUNC(datetime_value)truncate aDATE或 aTIMESTAMP資料型別并將時間組件設定為午夜:
CASE TRUNC(ola.promise_date) - TRUNC(ola.promise_date, 'IW')
WHEN 0 /* Monday */ THEN TRUNC(ola.promise_date) - 2
WHEN 1 /* Tuesday */ THEN TRUNC(ola.promise_date) - 4
WHEN 2 /* Wednesday */ THEN TRUNC(ola.promise_date) - 4
WHEN 6 /* Sunday */ THEN TRUNC(ola.promise_date) - 2
ELSE TRUNC(ola.promise_date) - 2
END mod_Promise_date
注意:TO_CHAR(datevalue, 'D')將根據您在世界上的位置給出不同的值,因為不同的地區認為一周從一周中的不同天開始。如果您想要一種與地區無關的方法來確定星期幾,那么您可以使用TRUNC(datetime_value) - TRUNC(datetime_value, 'IW').
uj5u.com熱心網友回復:
如果我理解正確,您只需截斷該值并“洗掉”時間組件(即將其重置為午夜)。
例如:
(只是設定格式;你不必這樣做)
SQL> alter session set nls_timestamp_format = 'dd.mm.yyyy hh24:mi:ss.ff6';
Session altered.
顯示結果的查詢:
SQL> select systimestamp,
2 trunc(systimestamp) result
3 from dual;
SYSTIMESTAMP RESULT
----------------------------------- -------------------
05.11.21 19:29:41,207000 01:00 05.11.2021 00:00:00
SQL>
你會有
... THEN (trunc(ola.promise_date) - 4)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349936.html
上一篇:如何在自連接中使用Exists
下一篇:如何根據不同表中的值填充表
