Ida*_*mit 6 sql datetime datetime2 sql-server-2016
在加盟时,我得到意想不到的结果DATETIME2(3)和DATETIME与PK列,在SQL Server 2016年
我有下表:
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]
Run Code Online (Sandbox Code Playgroud)
结果 :
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
Run Code Online (Sandbox Code Playgroud)
如您在上面看到的,值是相等的。
SELECT
a.DATETIME,
a.DATETIME2_3
FROM
DATETIME_TEST a
INNER JOIN
DATETIME_TEST b ON CONVERT(DATETIME2(3), a.[DATETIME]) = b.[DATETIME2_3]
Run Code Online (Sandbox Code Playgroud)
结果 :
DATETIME2_3 DATETIME
-----------------------------------------------------
2002-02-02 02:02:02.000 2002-02-02 02:02:02.000
Run Code Online (Sandbox Code Playgroud)
尽管值相等,但我只得到了一些行。
但是,如果我删除PK或将兼容性级别更改为COMPATIBILITY_LEVEL = 120,那么我将按预期获得所有行
是虫子吗?
有没有更好的方法来进行此加入。
注意:我加入同一张表只是为了简化现实中的示例,我加入了2张不同的表。
小智 0
其实我也遇到过这种情况。对于 Microsoft SQL Server 团队来说,这绝对是一个有效的问题。感谢您花时间提出此错误。
但作为替代解决方案,您应该尝试将“更丰富”的数据类型 (DATETIME2) 转换为“较差”的数据类型 (DATETIME) 作为向后兼容的方式。然后它会给你你正在寻找的结果:
SELECT
a.DATETIME,
a.DATETIME2_3
FROM
DATETIME_TEST a
INNER JOIN
DATETIME_TEST b ON a.[DATETIME] = CONVERT(DATETIME, b.[DATETIME2_3])
Run Code Online (Sandbox Code Playgroud)