DB2—以天为单位的两个时间戳之间的差异

DB2—以天为单位的两个时间戳之间的差异,db2,Db2,如何在DB2中以天为单位获得两个时间戳之间的精确差异。我的意思是,如果一个日期是从2015年5月6日下午2:22:27.000000到2015年3月30日下午2:33:52.000000,那么时间戳差应该显示36天。我试着在下面使用 ((24*DAYS(From_Date)+MIDNIGHT_SECONDS(From_Date)/3600) - (24*DAYS(To_Date)+MIDNIGHT_SECONDS(To_Date)/3600))/(24) 但这给了我37天的差

如何在DB2中以天为单位获得两个时间戳之间的精确差异。我的意思是,如果一个日期是从2015年5月6日下午2:22:27.000000到2015年3月30日下午2:33:52.000000,那么时间戳差应该显示36天。我试着在下面使用

((24*DAYS(From_Date)+MIDNIGHT_SECONDS(From_Date)/3600) -

        (24*DAYS(To_Date)+MIDNIGHT_SECONDS(To_Date)/3600))/(24)
但这给了我37天的差别。

怎么样

SELECT days_between ('2015-05-06-02.22.27.000000', '2015-03-30-02.33.52.000000')
FROM SYSIBM.sysdummy1
它返回36。

怎么办

SELECT days_between ('2015-05-06-02.22.27.000000', '2015-03-30-02.33.52.000000')
FROM SYSIBM.sysdummy1

它返回36。

错误的公式。查看以下内容

SELECT
  FROM_DATE, TO_DATE
,
(
  (24*DAYS(From_Date)+MIDNIGHT_SECONDS(From_Date)/3600) 
- (24*DAYS(To_Date)+MIDNIGHT_SECONDS(To_Date)/3600)
)/24 AS D1
, 
(
  (DAYS(From_Date)*bigint(86400) + MIDNIGHT_SECONDS(From_Date))
- (DAYS(To_Date)  *bigint(86400) + MIDNIGHT_SECONDS(To_Date))
)/86400 AS D2
FROM 
(
VALUES 
  (TIMESTAMP('2015-05-06-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
, (TIMESTAMP('2015-03-31-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
, (TIMESTAMP('2015-04-01-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
) T(FROM_DATE, TO_DATE);

|FROM_DATE                 |TO_DATE                   |D1         |D2                  |
|--------------------------|--------------------------|-----------|--------------------|
|2015-05-06-14.22.27.000000|2015-03-30-14.33.52.000000|37         |36                  |
|2015-03-31-14.22.27.000000|2015-03-30-14.33.52.000000|1          |0                   |
|2015-04-01-14.22.27.000000|2015-03-30-14.33.52.000000|2          |1                   |

错误的公式。查看以下内容

SELECT
  FROM_DATE, TO_DATE
,
(
  (24*DAYS(From_Date)+MIDNIGHT_SECONDS(From_Date)/3600) 
- (24*DAYS(To_Date)+MIDNIGHT_SECONDS(To_Date)/3600)
)/24 AS D1
, 
(
  (DAYS(From_Date)*bigint(86400) + MIDNIGHT_SECONDS(From_Date))
- (DAYS(To_Date)  *bigint(86400) + MIDNIGHT_SECONDS(To_Date))
)/86400 AS D2
FROM 
(
VALUES 
  (TIMESTAMP('2015-05-06-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
, (TIMESTAMP('2015-03-31-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
, (TIMESTAMP('2015-04-01-14.22.27'), TIMESTAMP('2015-03-30-14.33.52'))
) T(FROM_DATE, TO_DATE);

|FROM_DATE                 |TO_DATE                   |D1         |D2                  |
|--------------------------|--------------------------|-----------|--------------------|
|2015-05-06-14.22.27.000000|2015-03-30-14.33.52.000000|37         |36                  |
|2015-03-31-14.22.27.000000|2015-03-30-14.33.52.000000|1          |0                   |
|2015-04-01-14.22.27.000000|2015-03-30-14.33.52.000000|2          |1                   |

... 这个句柄如何跨越多个月?如果
TIMESTAMPDIFF
被用作封面下的源代码,它会让你大吃一惊(这就是为什么你必须在一些较旧的系统上使用OP的版本)。看起来,这正确地处理了所有可能的日期。它返回与
((天(自日期)*bigint(86400)+午夜秒(自日期))-(天(至日期)*bigint(86400)+午夜秒(至日期))/86400相同的输出。。。这个句柄如何跨越多个月?如果
TIMESTAMPDIFF
被用作封面下的源代码,它会让你大吃一惊(这就是为什么你必须在一些较旧的系统上使用OP的版本)。看起来,这正确地处理了所有可能的日期。它返回与
((天(从日期)*bigint(86400)+午夜秒(从日期))-(天(到日期)*bigint(86400)+午夜秒(到日期))/86400
相同的输出,这意味着您的方法的“分辨率”为一小时。你们的时间是同一个小时,所以互相抵消。此后,<代码> 37 似乎是正确的(三月:1天,四月:30天,五月:6天),虽然我会考虑向后的方向(也就是说,你应该得到<代码> -37 < /代码>)。解决您的问题需要考虑秒数和小数秒数。您需要
MIDNIGHT\u seconds(n)/3600
,这意味着您的方法的“分辨率”为一小时。你们的时间是同一个小时,所以互相抵消。此后,<代码> 37 似乎是正确的(三月:1天,四月:30天,五月:6天),虽然我会考虑向后的方向(也就是说,你应该得到<代码> -37 < /代码>)。解决您的问题需要考虑秒数和小数秒数。