【问题标题】:Msg 241, Level 16, State 1, Line 7 Conversion failed when converting datetime from character string消息 241,级别 16,状态 1,第 7 行从字符串转换日期时间时转换失败
【发布时间】:2014-04-05 04:30:04
【问题描述】:

我收到此错误消息:

消息 241,第 16 级,状态 1,第 7 行
从字符串转换日期时间时转换失败。

执行此脚本时。

declare
    @startdt datetime,
    @enddt datetime

SET @startdt = '2014-04-04' +'00:00:01'
SET @EndDt ='2014-04-04' + ' 23:59:59'

EXEC sp_Insert_JC_Payment @startdt,@enddt

我该怎么办?

将转换脚本放在哪里?

非常感谢

【问题讨论】:

  • 我的第一个想法是您的set 语句将分配这样的字符串:2014-040400:00:01。您可能需要在其中添加一个分隔空间。
  • 同意mike所说的,这里观点相同

标签: sql sql-server database


【解决方案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 数据类型。

所以在你的情况下,我会尝试使用:

SET @StartDate = '2014-04-04T00:00:01'
SET @EndDate   = '2014-04-04T23:59:59'

然后你就该走了!

【讨论】:

    【解决方案2】:

    你可以试试这个代码:

    cast(d.Datetime as date) between @datefrom and @dateto
    

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 2016-08-21
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多