我在 SQL Server 2016 中使用 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
虽然值相等,但我只得到了一些行。
但是,如果我删除主键或将兼容性级别更改为COMPATIBILITY_LEVEL = 120
,那么我会如预期地获取所有行。
这是一个错误吗?
有没有更好的方法来进行这个连接操作。
注意:我只是为了示例方便而连接到相同的表,在实际生活中,我连接的是两个不同的表。