【问题标题】:T- Sql date time conversion failedT-Sql 日期时间转换失败
【发布时间】:2012-02-29 19:32:25
【问题描述】:

我所有的列都是varchar,所以我使用通用表达式表将[Column 0]转换为datetime,因为[Column 0]包含2012-02-28 00:00:08.000这种格式的日期

WITH pss AS 
(
select CONVERT(datetime, [Column 0]) as t, [Column 1], [Column 2], [Column 3], [Column 4], [Column 5], [Column 6]
from PWS where [Column 0]  like '%2/28%'
)
select *from pss where datepart(HOUR,[t]) >= '11' AND datepart(HOUR,[t]) <= '12'

我收到以下消息

消息 242,第 16 级,状态 3,第 1 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

【问题讨论】:

  • 您可以使用ISDATE() 函数检查哪些值没有正确转换。
  • yes ISDATE() 返回所有行,1 表示所有行都是有效的日期时间
  • @AI25 - 如果删除 where 子句,ISDATE() 是否也只返回 1?
  • @lieven 是的,他们都返回 1
  • 你能发布一个显示问题的最小数据集吗?

标签: sql sql-server-2008 tsql


【解决方案1】:

您还需要使用 CONVERT 提供关于 varchar 中日期结构的提示。 ymd 序列将被识别为 102:

convert(datetime, '2012-02-28 00:00:08.000', 102)

有关 CONVERT 和可用日期时间样式的说明,请参阅 http://msdn.microsoft.com/en-us/library/ms187928.aspx

【讨论】:

  • 我已经用 102 成功完成了(实际上只是日期部分)。如果你想要完整的日期时间,那么 121 匹配你说你正在使用的分隔符
  • 但是,您的 SQL 正在寻找正斜杠,这将是 111 仅用于日期。那么你的日期是以什么格式存储的呢?
【解决方案2】:

SQL Server 中不允许使用早于 1753 年 1 月 1 日的日期时间数据类型的值。 SQL Server 只接受从 1753 年到 9999 年的日期。如果表中的 Column0 包含早于 1753 年 1 月 1 日的日期,您可能会遇到此类问题。

【讨论】:

    【解决方案3】:

    如果所有其他方法都失败,我将使用游标* 循环遍历每一行,然后,对于每一行,尝试将 [Column 0] 的值转换为 DateTime。用 TRY..CATCH 块包围 CONVERT 尝试,然后在 CATCH 块中输出一些诊断信息,以便您可以准确判断是哪一行导致了错误。

    注意 * :是的,通常要避免使用游标,但在这种诊断情况下,我认为它很有用。

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      相关资源
      最近更新 更多