繁体   English   中英

将日期类型列与时间戳列进行比较

[英]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:582022-08-06 23:36:58.373657进行比较。 那些不一样。

数据类型比较和优先级规则意味着日期值被隐式转换为时间戳,但这仅意味着它现在将2022-08-06 23:36:58.0000002022-08-06 23:36:58.373657进行比较。 那些仍然不一样。

由于您无法为日期添加精度,因此您必须从时间戳中删除精度,您可以通过将其转换为该数据类型来做到这一点:

case when created_date = cast(mod_date as date) then 'New' else 'Updated' end as status

db<>小提琴

但是,如果该行在创建的同一秒内被修改 - 例如,从之前使用的示例中,如果mod_date设置为2022-08-06 23:36:58.999999 - 那么这不会被视为更新,因为一旦精度降低,原始和更新的mod_date是相同的,并且都与created_date相同。

这对您来说可能不是问题,但如果您也将created_date设置为时间戳,并使用systimestamp进行设置,它仍然会更简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM