【发布时间】:2019-10-07 19:27:13
【问题描述】:
在 SQL Server 2016 中使用 PK 加入 DATETIME2(3) 和 DATETIME 列时,我得到了意想不到的结果。
我有下表:
CREATE TABLE DATETIME_TEST
(
[DATETIME] DATETIME NOT NULL,
[DATETIME2_3] DATETIME2(3)
);
ALTER TABLE DATETIME_TEST
ADD CONSTRAINT PK_DATETIME_TEST PRIMARY KEY ([DATETIME]);
INSERT INTO DATETIME_TEST ([DATETIME], [DATETIME2_3])
VALUES ('20020202 02:02:02.000', '20020202 02:02:02.000'),
('20020202 02:02:02.003', '20020202 02:02:02.003'),
('20020202 02:02:02.007', '20020202 02:02:02.007'),
('2019-04-28 07:23:29.447', '2019-04-28 07:23:29.447');
SELECT *
FROM DATETIME_TEST
WHERE CONVERT(DATETIME2(3), [DATETIME]) = [DATETIME2_3]
结果:
DATETIME DATETIME2_3
-------------------------------------------------
2002-02-02 02:02:02.000 2002-02-02 02:02:02.000
2002-02-02 02:02:02.003 2002-02-02 02:02:02.003
2002-02-02 02:02:02.007 2002-02-02 02:02:02.007
2019-04-28 07:23:29.447 2019-04-28 07:23:29.447
正如你在上面看到的,值是相等的。
SELECT
a.DATETIME,
a.DATETIME2_3
FROM
DATETIME_TEST a
INNER JOIN
DATETIME_TEST b ON CONVERT(DATETIME2(3), a.[DATETIME]) = b.[DATETIME2_3]
结果:
DATETIME2_3 DATETIME
-----------------------------------------------------
2002-02-02 02:02:02.000 2002-02-02 02:02:02.000
虽然值相等,但我只得到一些行。
但如果我删除 PK 或将兼容性级别更改为 COMPATIBILITY_LEVEL = 120,那么我会按预期获得所有行
这是一个错误吗?
有没有更好的方法来做这个加入。
注意:我加入同一个表只是为了在现实生活中我加入两个不同的表之间的示例。
【问题讨论】:
-
@DanGuzman 这不是重复的,因为帖子比较的是 DATETIME(7) 和 DATETIME。在我的帖子中,我了解隐式转换不起作用。所以,我进行了显式转换,但由于 PK 的存在而连接失败
-
感谢您抽出宝贵时间创建错误报告,赞成。
标签: sql datetime sql-server-2016 datetime2