DB2—以天为单位的两个时间戳之间的差异
如何在DB2中以天为单位获得两个时间戳之间的精确差异。我的意思是,如果一个日期是从2015年5月6日下午2:22:27.000000到2015年3月30日下午2:33:52.000000,那么时间戳差应该显示36天。我试着在下面使用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天的差
((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 < /代码>)。解决您的问题需要考虑秒数和小数秒数。