【问题标题】:Conversion failed when converting date and/or time from character string in MS SQL Server 2017从 MS SQL Server 2017 中的字符串转换日期和/或时间时转换失败
【发布时间】:2018-10-24 19:23:17
【问题描述】:

我是 MS SQL Server 的新手,我收到错误提示

从字符串转换日期和/或时间时转换失败

运行以下查询:

CREATE TABLE DateVals 
(
    dt datetime,
    t time,
    dt2 datetime2,
    dts datetimeoffset
);
GO

INSERT INTO DateVals (dt, t, dt2, dts)
VALUES ('2011-01-01 23:10:10.003', '23:10:10.003', '2011-01-01 23:10:10.003', '2011-01-01 23:10:10.003 +02.00');
GO

你能告诉我为什么会出现这个错误吗?

PS。我的操作系统语言是波兰语

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您的查询是正确的,当您使用 +02:00 时,只需要在 datetimeoffset 中使用冒号而不是逗号。

    INSERT INTO DateVals (dt, t, dt2, dts)
    VALUES ('2011-01-01 23:10:10.003', '23:10:10.003', '2011-01-01 23:10:10.003', '2011-01-01 23:10:10.003 +02:00');
    

    代替

    INSERT INTO DateVals (dt, t, dt2, dts)
    VALUES ('2011-01-01 23:10:10.003', '23:10:10.003', '2011-01-01 23:10:10.003', '2011-01-01 23:10:10.003 +02.00');
    

    【讨论】:

      【解决方案2】:

      将字符串文字转换为 DATETIME 列是一种冒险 - 而 DATETIME 对于支持的格式非常特殊

      解决此问题的最佳方法是使用 SQL Server 支持的(稍作调整的)ISO-8601 日期格式 - 这种格式始终有效 - 无论您的 SQL Server 语言和日期格式设置。

      SQL Server 支持的ISO-8601 format 有两种形式:

      • YYYYMMDD 仅用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD独立于 SQL Server 中的日期格式设置,并且适用于所有情况!

      或:

      • YYYY-MM-DDTHH:MM:SS 用于日期和时间 - 请注意:这种格式破折号(但它们可以省略),以及固定的T作为日期和时间之间的分隔符DATETIME 的一部分。

      因此,在您的情况下,请尝试以下任一方法:

      INSERT INTO DateVals (dt, t, dt2, dts)
      VALUES ('2011-01-01T23:10:10', '23:10:10.003', '2011-01-01 23:10:10.003', '2011-01-01 23:10:10.003 +02:00');
      

      您还需要在 +02:00 绰号中为 DATETIMEOFFSET 使用 : - 不是点或逗号

      或在您的表中将dt 设为DATETIME2(n) 类型的列(而不是DATETIME)。

      这对 SQL Server 2000 和更高版本有效。

      如果您使用 SQL Server 2008 或更高版本以及 DATE 数据类型(仅限 DATE - 不是 DATETIME!),那么您确实也可以使用YYYY-MM-DD 格式并且也适用于 SQL Server 中的任何设置。

      不要问我为什么整个话题如此棘手和令人困惑——事情就是这样。但是使用YYYYMMDD 格式,您应该可以适应任何版本的 SQL Server 以及 SQL Server 中的任何语言和日期格式设置。

      对于 SQL Server 2008 及更高版本,如果您只需要日期部分,建议使用 DATE,如果同时需要日期和时间,则使用 DATETIME2(n)。如果可能,您应该尝试开始逐步淘汰 DATETIME 数据类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多