sql - 如何截断时间戳以重新调整 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 的新手,如果我不够清楚或者查询看起来不可行,我很抱歉。
解决方案
您可以使用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')
.
推荐阅读
- python - Django 渲染指定目录中不存在的模板
- flutter - 将列表转换为 json 对象删除一些键时出现颤振错误
- r - R:如何通过部分匹配它们的列来合并两个数据集?
- python - Django 部署 - 在 fastCGI 应用程序配置中找不到 scriptProcessor
- python - 是否有 Python 模块可以让我创建像 CMD 这样的命令行界面?
- vb.net - 如何在 VB.Net 中定位内存地址?
- html - 选择后的角度变化选择类
- mongodb - 如何在 MongoDB 的一个查询中从多个集合中删除文档?
- java - 无法在 XAMPP(Windows)上运行 tomcat
- kafkajs - 如何使用 kafkajs-avro 确定通用消息的记录类型