[英]Comparing date type column with a timestamp column
我有一张桌子,说三列的演示
create table demo(demo_id number,
created_date date,
mod_date systimestamp(6)
);
我的要求是返回一个包含两列的 refcursor
1. Demo_id
2. Status column
这将导出如下:
if created_date = mod_date then "New" else "Updated" .
所以我把我的代码写成:
select demo_id ,case when created_date=mod_date then "New" else "update" end from demo;
但不知何故,即使日期相同,包括时间组件我的状态值总是显示更新。 我正在使用 SQL 开发人员运行我的查询,并将 nls_date_format 修改为 DD/mm/yyyy hh24:mi:SS。 mod_date 也将存储 systimestamp。
您正在将具有秒精度的日期与具有小数秒精度的时间戳进行比较。
如果created_date
取自 sysdate 而mod_date
取自 systimestamp ,那么您可以将2022-08-06 23:36:58
与2022-08-06 23:36:58.373657
进行比较。 那些不一样。
数据类型比较和优先级规则意味着日期值被隐式转换为时间戳,但这仅意味着它现在将2022-08-06 23:36:58.000000
与2022-08-06 23:36:58.373657
进行比较。 那些仍然不一样。
由于您无法为日期添加精度,因此您必须从时间戳中删除精度,您可以通过将其转换为该数据类型来做到这一点:
case when created_date = cast(mod_date as date) then 'New' else 'Updated' end as status
但是,如果该行在创建的同一秒内被修改 - 例如,从之前使用的示例中,如果mod_date
设置为2022-08-06 23:36:58.999999
- 那么这不会被视为更新,因为一旦精度降低,原始和更新的mod_date
是相同的,并且都与created_date
相同。
这对您来说可能不是问题,但如果您也将created_date
设置为时间戳,并使用systimestamp
进行设置,它仍然会更简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.