1

我正在尝试在 Oracle 中想出一种方法来计算日期之间的天数差异。

简而言之。我有两个数据字段“begins_at”和“ends_at”,这些字段的 DATA_TYPE 是“TIMESTAMP(6)”

例如。我有以下情况:

“begins_at”值为“26-MAR-13 02.50.00.000000000 PM”</p>

“ends_at”值为“30-MAR-13 09.25.00.000000000 PM”</p>

我正在尝试以天计算两个时间戳之间的差异。甲骨文有可能吗?

我尝试了以下语句,但抛出了一个错误:

Select TO_DATE(begins_at, 'YYYYMMDD HH:MI:SS AM') - TO_DATE(ends_at, 'YYYYMMDD   HH:MI:SS AM') day_diff

From dual

非常感谢任何提示。

4

4 回答 4

7

正如我们匿名的马友所说,“抛出错误”没有帮助。但是,您很可能会收到 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视为dateusing 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可能会使您的操作更简单,但我想这取决于您以后打算如何处理这些字段。

于 2013-04-02T08:11:40.043 回答
1

请参阅http://docs.oracle.com/cd/E17952_01/refman-5.1-en/date-and-time-functions.html#function_datediff。它描述了DATEDIFF,它返回以天为单位的差异,仅处理日期值。

于 2013-04-02T03:50:03.083 回答
1

尝试这样的事情:

SELECT  TO_DATE('20120125 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM')
     - TO_DATE('20120120 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') day_diff
FROM   dual

你可以参考这个。它真的会帮助你

于 2013-04-02T04:08:17.780 回答
1

天,小时,分钟,秒的差异。示例 - 复制/粘贴以查看输出。用您的日期替换日期...:

SELECT start_date, end_date, time_diff,
       EXTRACT(DAY FROM time_diff) days,
       EXTRACT(HOUR FROM time_diff) hours,
       EXTRACT(MINUTE FROM time_diff) minutes,
       EXTRACT(SECOND FROM time_diff) seconds
  FROM
  (
   Select start_date, end_date, (end_date - start_date) time_diff
     From
     (
      Select CAST(to_date('01/01/2012 10:00:00 am', 'dd/mm/yyyy  hh:mi:ss am') AS TIMESTAMP) end_date
           , CAST(to_date('01/01/2012 07:00:00 am', 'dd/mm/yyyy  hh:mi:ss am') AS TIMESTAMP) start_date
       From dual
     )
   )
  /

仅减去时间示例:

SELECT trunc(mydate / 3600) hr
     , trunc(mod(mydate, 3600) / 60) mnt
     , trunc(mod(mydate, 3600) / 60 /60) sec
  FROM 
  (
   SELECT (to_date('01/03/2012 10:00:00', 'mm/dd/yyyy  hh24:mi:ss') -
           to_date('01/01/2012 07:00:00', 'mm/dd/yyyy  hh24:mi:ss')) * 86400 mydate
     FROM dual
  )
 /

HR  MNT SEC
-------------
51  0   0
于 2013-04-02T13:15:10.810 回答