Sql varchar字段和timestamp字段之间的时间差

Sql varchar字段和timestamp字段之间的时间差,sql,oracle,Sql,Oracle,我有两个日期字段,如下所示(我知道它们的设计不正确,但DBA不会更改) 我知道找到timestamp\u字段和varchar(2)字段之间的时间差 我尝试了以下sql并得到一个ora错误: ORA-01850:小时必须介于0和23之间 ORA-01850:小时必须介于0和23之间到日期(日期字符串、格式掩码)将字符串作为第一个值,并传入日期数据类型。为了解决这个问题,Oracle将在日期隐式调用To_CHAR(日期值、格式掩码)将其转换为字符串,并使用NLS_日期格式会话参数作为格式掩码 如果您

我有两个日期字段,如下所示(我知道它们的设计不正确,但DBA不会更改)

我知道找到
timestamp\u字段
varchar(2)
字段之间的时间差

我尝试了以下sql并得到一个ora错误:

ORA-01850:小时必须介于0和23之间

ORA-01850:小时必须介于0和23之间

到日期(日期字符串、格式掩码)
将字符串作为第一个值,并传入日期数据类型。为了解决这个问题,Oracle将在日期隐式调用
To_CHAR(日期值、格式掩码)
将其转换为字符串,并使用
NLS_日期格式
会话参数作为格式掩码

如果您这样做:

SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
您将看到Oracle正在使用的格式掩码,它几乎肯定与您在迄今为止的
中使用的
HH24:MI:SS
掩码不匹配

相反,您可以尝试显式调用
到\u CHAR
并指定格式掩码:

select orq.order_tag,
       rt.dt_changed, 
       to_date( TO_CHAR( rt.dt_changed, 'HH24:MI:SS' ),'hh24:mi:ss') -
         to_date (orq.order_tag, 'hh24:mi:ss') time_differ
from   order_request orq,route rt
where  orq.rt_id = rt.rt_id

您似乎希望结果是
INTERVAL
数据类型,而不是
NUMBER
。如果将这两个值都转换为
日期
,则差值为
数字
(以天为单位),然后需要将其转换为所需格式。顺便说一下,要将时间戳转换为日期,您不应该使用to_CHAR;比这简单得多,只需使用
CAST(您的时间戳为DATE)

但你不需要这样。相反,只需将VARCHAR2转换为TIMESTAMP,使用
转换为\u TIMESTAMP(…,format\u model)
。两个时间戳的差就是一个间隔,这正是您想要的

设置(注意-您的第一列肯定不是varchar(2)!)

查询(注意天数-您的
订单标签
列没有日期,因此默认情况下是当月的第一天。如果这对您的业务没有好处,那么您还应该存储日期,而不仅仅是一天中的时间。)

如果您必须将日期从DT_更改为string-in-ORDER_标记“附加”,那么您可以执行以下愚蠢的操作(不推荐):


不要在varchar列中存储日期/时间数据,请使用正确的数据类型!订单标签真的是VARCHAR(2)吗?如何将长度为8的字符串放入一个最多只允许两个字符的列中?查询可以工作,但时间差似乎不正确顺序\u标记DT\u更改时间\u差异06:00:13 27-MAR-17 06.10.31.036561 0.007152778 06:00:14 27-MAR-1706.15.31.031092 0.010613426 06:05:13 27-MAR-17 06.29.50.911644 0.017094907 06:10:13 27-MAR-17 06.24.53.850697 0.01018518506:11:13 27-MAR-17 06.13.40.959042 0.001701389 06:12:14 27-MAR-17 06.15.13.467060 0.002071759 06:13:13-27-MAR-17 06.13.14.199357 1.15741E-06:15:13-MAR-13.05-1369046.01936.06记录一份订单标签更改时间不同06:00:13 27-MAR-17 06.10.31.036561 0。007152778@sbirdi由于你的观点不清楚,你能解释一下那篇评论的目的吗(仅显示1行作为输出的示例,order_tag=06:00:13和dt_changed=27-MAR-17 06.10.31.036561,因此我怀疑时间差大约为10分钟31秒,但显示时上面的查询为0.007152778。)
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
select orq.order_tag,
       rt.dt_changed, 
       to_date( TO_CHAR( rt.dt_changed, 'HH24:MI:SS' ),'hh24:mi:ss') -
         to_date (orq.order_tag, 'hh24:mi:ss') time_differ
from   order_request orq,route rt
where  orq.rt_id = rt.rt_id
create table test_data (order_tag varchar2(20), dt_changed timestamp(6));

Table TEST_DATA created.

insert into test_data 
  values ('06:35:13', to_timestamp('27-MAR-17 06.10.31.036561', 'dd-MON-rr hh24.mi.ss.ff'));

1 row inserted.
select to_timestamp(order_tag, 'hh24:mi:ss') - dt_changed as time_diff from test_data;

TIME_DIFF
-------------------
-25 23:35:18.036561
select to_timestamp(to_char(dt_changed, 'dd-MON-rr') || order_tag, 'dd-MON-yyhh24:mi:ss')
        - dt_changed as time_diff from test_data;

TIME_DIFF
-------------------
+00 00:24:41.963439