SQL Server 2016 : join DATETIME2(3) with DATETIME

标签 sql datetime sql-server-2016 datetime2

加入 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]

结果 :
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 ,然后我按预期获得所有行

这是一个错误吗?

有没有更好的方法来执行此连接。

注意:我加入同一个表只是为了在现实生活中我加入 2 个不同表之间的示例的简单性。

最佳答案

其实我也遇到过这种情况。对于 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])

关于SQL Server 2016 : join DATETIME2(3) with DATETIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237652/

相关文章:

sql - PostgreSQL 获取两个日期时间/时间戳之间的随机日期时间/时间戳

sql - 如何根据相同的日期范围计算不同表中的行数

python - 数据清理——ifelse语句

visual-studio-2015 - 加载 SSIS 包或新项目时 SSDT 崩溃

ms-access - 是否可以从 Access 更新 SQL Server 2016 时态表?

sql - SQL如果select语句不返回任何行,则执行替代的select语句

javascript - 获取javascript ISO格式的时间差

asp.net - 如何为我的 ASP.NET (MVC) 应用程序设置时区

sql-server - 数据类型 date 和 datetime 在 add 运算符中不兼容

mysql - 在 View 中使用创建的列