【问题标题】:Error converting data type nvarchar to datetime将数据类型 nvarchar 转换为 datetime 时出错
【发布时间】:2012-07-23 23:51:31
【问题描述】:

我的程序界面如下:

Create procedure [dbo].[InsertItemDetails]
    @TimeItemAdded datetime

当我这样称呼它时:

EXEC [dbo].[InsertItemDetails]
     @TimeItemAdded = N'20/07/2012 00:00:00';

我收到此错误:

消息 8114,级别 16,状态 5
将数据类型 nvarchar 转换为日期时间时出错。

【问题讨论】:

标签: sql-server-2005 datetime type-conversion


【解决方案1】:

根据您的区域设置,您为@TimeItemAdded 传递的参数可能无法识别。

您应该将日期传递为:

20120720

【讨论】:

  • 这不是一种安全的格式。 SET LANGUAGE FRENCH; SELECT CONVERT(DATETIME, '2012-07-20 00:00:00'); 产生 Msg 242, Level 16, State 3, Line 2; La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites. 日期时间的安全格式是 YYYYMMDDYYYY-MM-DDTHH:MM:SS.nnn - T 很重要。
  • @AaronBertrand - 令人着迷;消除了一致性的时间
  • 即使没有时间,语言仍然不安全。破折号是问题所在。在法语(和其他一些语言环境)中,这被解释为YYYY-DD-MM。显然没有第 20 个月。 YYYYMMDD 对这个问题免疫。
  • 有趣;我们有一些法国网站,我发誓这从未出现过,但我相信你。
【解决方案2】:

为您的日期使用明确的字符串文字。在这种情况下:

EXEC dbo.InsertItemDetails
    ...
    , @TimeItemAdded = '20120720';

更好的是,确保在您知道日期正确的地方传递强类型参数。理想情况下,这不应该以任何格式显示为字符串。

像 m/d/y 这样的区域格式是个坏消息,因为在考虑到用户会话、日期格式、语言设置、机器上的区域设置等的情况下,您无法确保它们能够正常工作。

【讨论】:

    【解决方案3】:

    SQL 将您的日期读取为 7/20/2012 无效,您可以使用更安全的格式 yyyy-MM-dd 传递您的日期对象,例如:2012-07-20

    【讨论】:

      【解决方案4】:

      此链接包含所有日期时间格式及其相关内容 http://www.sql-server-helper.com/tips/date-formats.aspx

      您可以将其作为 varchar 传递,并使用正确的日期格式代码将其显式转换为日期时间。例如:

      SELECT CONVERT(DATETIME, '20/07/2012 00:00:00', 103)
      

      103 是您要查找的日期时间代码。

      【讨论】:

      • 我不同意你应该把参数改成varchar。尽早修复格式(或使用正确的数据类型)。如果将参数更改为 varchar,人们可以传入他们想要的任何内容。例如,mm/dd/yyyy 会中断; 06/07/2012 只会默默存储错误的日期,07/20/2012 会产生异常。
      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2015-03-14
      • 2015-12-24
      • 2020-06-02
      • 2012-09-25
      相关资源
      最近更新 更多