首页 > 解决方案 > 如何截断时间戳以重新调整 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.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 的新手,如果我不够清楚或者查询看起来不可行,我很抱歉。

标签: sqloracle

解决方案


您可以使用TRUNC(datetime_value)截断一个DATE或一个TIMESTAMP数据类型并将时间组件设置为午夜:

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').


推荐阅读