【问题标题】:Conversion error when converting 'nvarchar' to 'datetime' in sql server在 sql server 中将“nvarchar”转换为“datetime”时出现转换错误
【发布时间】:2014-05-16 14:33:31
【问题描述】:

我有这个代码:

DECLARE @StartDate nvarchar
SET @StartDate='22/10/2014'
SELECT CAST (@StartDate as datetime)

它给了我这个错误:

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

任何人都可以提出更好的方法/至少没有错误的方法来做到这一点。

【问题讨论】:

    标签: sql sql-server-2008 nvarchar datetime-conversion


    【解决方案1】:

    SQL Server 支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。这些格式中的大多数取决于您拥有的设置 - 因此,这些设置有时可能有效 - 有时无效。

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

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

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

    或:

    • YYYY-MM-DDTHH:MM:SS 用于日期和时间 - 请注意:此格式短划线(但它们可以省略),以及固定的T 作为日期和时间之间的分隔符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 数据类型

    【讨论】:

      【解决方案2】:

      要将代表日期的字符串转换为dd/mm/yyyy 格式,您可以使用以下命令:

      DECLARE @StartDate nvarchar(10)
      SET @StartDate='22/10/2014'     
      SELECT CONVERT(datetime, @StartDate, 103)
      

      声明varchar意味着将长度设置为1。

      【讨论】:

      • 现在它给出了错误:将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。
      • 但在我的情况下,@Hamlet Hakobyan '22/10/2014' 来自数据库。我的意思是它是这样保存的列值。我认为无论如何将 '22/10/2014' 转换为 '20141022' ?然后就可以了。
      • 那行得通。一件小事你能帮我从中找到月份吗?我的意思是像'jan'而不是'01'这样的字符串形式
      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多