SQLPlus执行datetime差值转分钟查询返回0的问题咨询
问题原因说明
该问题完全是SQL语句编写错误导致,和SQL*Plus配置没有任何关系。
核心错误点
- 对DATE类型字段做了多余的
to_date转换,导致时分秒被截断
如果你的modified_datetime字段本身就是DATE类型,使用to_date(a.modified_datetime, 'yyyy/mm/dd hh24:mi:ss')写法时,Oracle会先把DATE类型值按照会话默认日期格式隐式转成字符串,再按你指定的格式转成DATE。Oracle默认会话日期格式为DD-MON-RR,不包含时分秒信息,转换后所有时间的时分秒都会变成00:00:00,两个时间的差值自然为0。 - 时间差转换公式存在语法错误
Oracle中两个DATE类型值相减的结果单位为天,转分钟的正确写法为天数差 * 24 * 60,你的代码中差值和60之间缺少乘号,虽然乘法交换律不影响最终计算结果,但缺漏运算符属于语法问题,部分环境下可能直接报错。 - 存在多处多余逗号的语法问题
两个子查询的SELECT列表末尾、FROM子句的b表后面都多写了逗号,属于明显的语法错误,正常执行会直接报错,你能运行大概率是粘贴代码时误加了多余逗号。
修正后的SQL
如果确认modified_datetime是DATE类型,直接去掉多余的to_date转换即可,简化写法如下:
select a.user_id as user_id, (a.modified_datetime - b.modified_datetime) * 24 * 60 as minutes from (select user_id, modified_datetime from table_name where some_conditions) a, (select user_id, modified_datetime from table_name where other_conditions) b where a.user_id = b.user_id;
如果modified_datetime是字符串类型,需要先指定格式转成DATE,再做差值计算即可。
内容的提问来源于stack exchange,提问作者Rohan Kishibe
相关产品推荐
相关产品推荐

