Oracle SQL计算sysdate与另一表日期差值及查询语句修正
你当前语句运行失败的核心原因是类型不匹配:sysdate减去日期类型的latestExport得到的是天数差(数值类型),你直接用日期类型的mydate和数值比较,自然会触发报错。如果latestExport是字符串格式存储的,还会额外存在隐式转换失败的问题。
解决方案
情况1:latestExport本身是DATE类型
如果你需要查询myTable1中mydate晚等于最近导出日期的记录,直接简化语句即可:
SELECT something FROM myTable1 WHERE mydate >= (SELECT latestExport FROM myTable2 WHERE id=1);
如果担心子查询返回多条记录,可以加聚合函数保证唯一返回值:
SELECT something FROM myTable1 WHERE mydate >= (SELECT MAX(latestExport) FROM myTable2 WHERE id=1);
情况2:latestExport是字符串类型(存储格式为27-JUL-21)
需要先通过TO_DATE函数把字符串转为日期类型,同时指定日期格式和语言参数避免转换报错:
SELECT something FROM myTable1 WHERE mydate >= ( SELECT TO_DATE(latestExport, 'DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN') FROM myTable2 WHERE id=1 );
如果你需要单独计算两个日期的差值
两个日期直接相减得到的结果单位为天,可以按需转换为小时、分钟等单位:
-- 计算相差天数 SELECT SYSDATE - (SELECT TO_DATE(latestExport, 'DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN') FROM myTable2 WHERE id=1) AS diff_days FROM DUAL; -- 计算相差小时 SELECT (SYSDATE - (SELECT TO_DATE(latestExport, 'DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN') FROM myTable2 WHERE id=1)) * 24 AS diff_hours FROM DUAL;
内容的提问来源于stack exchange,提问作者80root
相关产品推荐
相关产品推荐

