正如我们匿名的马友所说,“抛出错误”没有帮助。但是,您很可能会收到 ORA-01830、“日期格式图片在转换整个输入字符串之前结束”或 ORA-1858、“在预期数字的位置发现非数字字符”或类似内容。
该to_date
函数接受一个char
参数,因此当您将timestamp
字段传递给它时,会发生隐式转换;你实际上是在做:
to_date(to_char(begins_at, 'DD-MON-RR'), 'YYYYMMDD HH:MI:SS AM')
...仅使用您的默认 NLS 设置;我猜你的 NLS_DATE_FORMAT 在这个例子中设置为 'DD-MON-RR';确切的值会影响你得到的错误。您timestamp
作为字符串给出的格式与您为 指定的格式不匹配to_date
。
您永远不应该依赖隐式转换,但您根本不需要在这里进行转换。timestamp
值可以直接比较,结果在文档中解释。只需从另一个值中减去一个值,就可以将答案作为interval
数据类型:
select ends_at - begins_at from t42;
ENDS_AT-BEGINS_AT
---------------------------------------------------------------------------
+000000004 06:35:00.000000
如果您只想要一整天的部分,您可以使用extract
:
从 t42 中选择提取(从 ends_at 到开始时间的日期);
EXTRACT(DAYFROMENDS_AT-BEGINS_AT)
---------------------------------
4
您也可以将其timestamp
视为date
using cast
:
select cast(ends_at as date) - cast(begins_at as date) from t42;
CAST(ENDS_ATASDATE)-CAST(BEGINS_ATASDATE)
-----------------------------------------
4.27430556
我不确定你为什么要使用timestamp
。Oracledate
类型包括一个时间部分,精确到一秒。由于您(当前)似乎没有使用时间戳的小数部分,因此坚持使用date
可能会使您的操作更简单,但我想这取决于您以后打算如何处理这些字段。