我有一张有三列的桌子,叫DEMO

create table demo(demo_id number,
                  created_date date,
                  mod_date systimestamp(6)
                 ); 

我的要求是返回一个包含两列的引用游标

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 Developer运行我的查询,并且还将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的东西.这些都不是一回事.

数据类型比较和precedence规则意味着日期值被隐式转换为时间戳,但这只是意味着它现在正在比较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<>fiddle

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

这对您来说可能不是问题,但如果您也将时间戳设置为created_date,并将其设置为systimestamp,则仍然会更简单.

Sql相关问答推荐

获取每5分钟时间间隔的总和

基于多个字段删除Access中的重复记录,同时保留最低优先级

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

SQL:如何将相应位置的两个数组中的元素组合在一起

DBeaver将过程中的属性列表转换为字符串

snowflake/SQL嵌套的JSON对象和数组

如何将`now()`作为SQL插入语句的一部分?

在SQL中,筛选其他列中只有一个值的ID

在子窗口SQL Presto中使用特定条件执行值计数

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

JSON_VALUE 不适用于提取的 json 中的嵌套路径

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

Postgresql 具有相似行为和模式行为的问题

清理 XML 数据

如何在sparksql查询中使用日期值?

按所选的值将记录分组到不同的列中

在自引用表中使用分组和计数的SQL查询语句

snowflake插入覆盖行为

如何刷新在视图之上创建的表

GROUP 中跨列的 SQL 查询/UDF