You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DATE列与SYSTIMESTAMP列比较结果异常问题咨询

日期与时间戳匹配问题的解决

表结构

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

需求

返回包含两列的REF CURSOR:

  • Demo_id
  • Status列,取值规则:

    若created_date = mod_date则为"New",否则为"Updated"

问题现象

执行以下SQL时,即使created_date和mod_date的日期时间部分视觉上一致,Status列始终显示"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值。

问题根源

  1. 数据类型精度不匹配:DATE类型仅精确到秒,而SYSTIMESTAMP(6)精确到微秒(6位小数)。直接比较时,Oracle会把DATE隐式转为TIMESTAMP,此时DATE的秒后补0,但mod_date实际存储的微秒部分可能不为0,导致两者不相等。
  2. 字符串引用错误:Oracle中双引号"New"用于标识对象名(如表、列名),字符串常量必须用单引号'New'。

修复后的SQL

方案一:截断时间戳到秒级别

SELECT 
    demo_id,
    CASE 
        WHEN created_date = TRUNC(mod_date, 'SS') THEN 'New' 
        ELSE 'Updated' 
    END AS status
FROM demo;

方案二:转换日期为时间戳后比较

SELECT 
    demo_id,
    CASE 
        WHEN CAST(created_date AS TIMESTAMP(0)) = TRUNC(mod_date, 'SS') THEN 'New' 
        ELSE 'Updated' 
    END AS status
FROM demo;

内容的提问来源于stack exchange,提问作者Surbhi Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:54:24