如何在Oracle中截断时间戳以重新调整日期



我在Oracle的SELECT中有以下查询:

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.procise_date"是TIMESTAMP类型的列,我使用CASE语句来调整日期,考虑到原始承诺日期的星期几(因为内部对装运的考虑等(因此,例如,承诺日期为2021-11-07 00:00:00000000的东西将具有修改后的承诺日期2021-11-05 00:00:000000000(将周日视为第七天(

现在,我用C#制作的程序运行这个查询,我有一个日期选择器来选择特定的承诺日期,所以用户可以选择2021年11月7日星期日,它会像前面所说的那样运行查询,这很好,但承诺日期大约是2021-11-07 23:59:00000000,因为查询会将日期视为11月8日,而不是7日,这不是预期的行为,因为在项目的这个特定实例中,小时、分钟、秒和小数秒并不是真正需要的。

有没有办法忽略CASE-WHEN语句中的小时、分钟、秒和小数秒?或者把日期记下来,在指定的同一天考虑所有事情,而不考虑时间。

我是一个使用Oracle的新手,如果我不够清楚或者查询看起来不可行,我很抱歉。

您可以使用TRUNC(datetime_value)截断DATETIMESTAMP数据类型,并将时间组件设置为午夜:

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')找到与ISO周开始时的差异。

如果我理解正确,您只需要截断该值并"删除";时间分量(即将其重置为午夜(。

例如:

(只需设置格式;您不必这样做(

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)

最新更新