比较日期 db2/400 与 SQL 服务器
Compare dates db2/400 vs SQL Server
我想比较来自 SQL 服务器(类型 datetime-16)的 date/time 与 db2/400(类型 Z)。
通常我想知道 18:44 和 18:45
之间有 60 秒
每一个的显示特性都略有不同。
SQL Server 2016-07-26 18:45:00.000
Db2/400 2016-07-26-18.45.00.000000
如果我在我的 db2 数据库上这样做:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - '2016-07-26 18:44:00.000'
FROM @dates
我明白了
MYDATETIME Constant value Numeric Expression
2016-07-26-18.45.00.000000 2016-07-26 18:44:00.000 100.000000
Db2 SQL 接受稍微不同的格式似乎相当慷慨。
但是查询告诉我 1 分钟的差异 = 100。看起来我在这里进行了以 10 为基数的比较。
使用 db2 时间戳函数,我得到相同的结果
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - timestamp('2016-07-26-18.44.00.000000')
FROM @dates
我怎样才能进行比较,让我在几分钟(或几小时或几天)内有所不同?
我知道这是 DB2/400,但根据我的经验,时间运算符的工作方式相同,因此从 this article:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - timestamp('2016-07-26-18.44.00.000000') SECONDS
FROM @dates
因为我没有 DB2 实例来测试它,接下来我要尝试的是:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
SECOND(MYDATETIME - timestamp('2016-07-26-18.44.00.000000'))
FROM @dates
在 DB2 for IBM i 上减去两个时间戳的结果称为 duration
您可能会发现 TIMESTAMPDIFF()
有用
select
timestampdiff(2
, char(timestamp('2016-07-27 08:35:00.000000')
- timestamp('2016-07-27 08:34:00.000000')
)
)
from sysibm.sysdummy1
注意第一个参数是一个small int,其值如下
1 Microseconds
2 Seconds
4 Minutes
8 Hours
16 Days
32 Weeks
64 Months
128 Quarters
256 Years
第二个参数必须是持续时间的字符表示。
EDIT 正如 Clockwork-Muse 所指出的,TIMESTAMPDIFF()
最适合短于一个月的持续时间。
如果您需要对更长的值进行精确计算,请使用以下形式:
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
样本
select
(DAYS(timestamp('2016-07-27 08:35:00.000000'))
- DAYS(timestamp('2015-07-27 08:35:00.000000'))
) * 86400 +
(MIDNIGHT_SECONDS(timestamp('2016-07-27 08:35:00.000000'))
- MIDNIGHT_SECONDS(timestamp('2015-07-27 08:35:00.000000')))
from sysibm.sysdummy1
我想比较来自 SQL 服务器(类型 datetime-16)的 date/time 与 db2/400(类型 Z)。
通常我想知道 18:44 和 18:45
之间有 60 秒每一个的显示特性都略有不同。
SQL Server 2016-07-26 18:45:00.000
Db2/400 2016-07-26-18.45.00.000000
如果我在我的 db2 数据库上这样做:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - '2016-07-26 18:44:00.000'
FROM @dates
我明白了
MYDATETIME Constant value Numeric Expression
2016-07-26-18.45.00.000000 2016-07-26 18:44:00.000 100.000000
Db2 SQL 接受稍微不同的格式似乎相当慷慨。
但是查询告诉我 1 分钟的差异 = 100。看起来我在这里进行了以 10 为基数的比较。
使用 db2 时间戳函数,我得到相同的结果
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - timestamp('2016-07-26-18.44.00.000000')
FROM @dates
我怎样才能进行比较,让我在几分钟(或几小时或几天)内有所不同?
我知道这是 DB2/400,但根据我的经验,时间运算符的工作方式相同,因此从 this article:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
MYDATETIME - timestamp('2016-07-26-18.44.00.000000') SECONDS
FROM @dates
因为我没有 DB2 实例来测试它,接下来我要尝试的是:
SELECT
MYDATETIME,
'2016-07-26 18:44:00.000',
SECOND(MYDATETIME - timestamp('2016-07-26-18.44.00.000000'))
FROM @dates
在 DB2 for IBM i 上减去两个时间戳的结果称为 duration
您可能会发现 TIMESTAMPDIFF()
有用
select
timestampdiff(2
, char(timestamp('2016-07-27 08:35:00.000000')
- timestamp('2016-07-27 08:34:00.000000')
)
)
from sysibm.sysdummy1
注意第一个参数是一个small int,其值如下
1 Microseconds
2 Seconds
4 Minutes
8 Hours
16 Days
32 Weeks
64 Months
128 Quarters
256 Years
第二个参数必须是持续时间的字符表示。
EDIT 正如 Clockwork-Muse 所指出的,TIMESTAMPDIFF()
最适合短于一个月的持续时间。
如果您需要对更长的值进行精确计算,请使用以下形式:
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
样本
select
(DAYS(timestamp('2016-07-27 08:35:00.000000'))
- DAYS(timestamp('2015-07-27 08:35:00.000000'))
) * 86400 +
(MIDNIGHT_SECONDS(timestamp('2016-07-27 08:35:00.000000'))
- MIDNIGHT_SECONDS(timestamp('2015-07-27 08:35:00.000000')))
from sysibm.sysdummy1