我在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“是一列类型为时间戳的列,我使用CASE语句来调整日期,考虑到最初承诺日期的一周的日期(除其他外,出于内部考虑),因此,例如,一些承诺日期为2021-11-07 : 00:00:00.0000000的产品将有一个修改后的承诺日期: 2021-11-05 00: 00:00:00.0000000 (考虑星期日为第七天)。
现在,我用一个用C#制作的程序运行这个查询,我有一个日期选择器来选择特定的承诺日期,这样用户就可以选择星期日,2021年11月7日,它将像前面提到的那样运行这个查询,除了承诺日期之外,比如2021-11-07 23:59:00.0000000,因为查询将把日期看作是11月8日而不是7日,这不是预期的行为,因为在这个特定的项目实例中,并不真正需要小时、分钟、秒和分数秒。
在这种情况下,是否存在忽略时间、分钟、秒和小数秒的方法--时间语句?或将日期降至与指定日期相同的日期,而不考虑时间。
我使用Oracle非常新,如果我不够清楚或者查询看起来不可行的话,很抱歉。
发布于 2021-11-05 19:11:14
可以使用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')
找到从国际标准化周开始的不同之处。
发布于 2021-11-05 18:31:19
如果我正确地理解了您,您只需截断该值并“删除”时间组件(即将其重置为午夜)。
例如:
(只是设置格式;您不必这样做)
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://stackoverflow.com/questions/69857659
复制相似问题