【问题标题】:Conversion of varchar into Datetimevarchar 到 Datetime 的转换
【发布时间】:2011-01-13 16:23:58
【问题描述】:

为什么下面的代码有效:

CAST(DateOfAction AS Date)

但这段代码没有:

CAST(DateOfAction AS Datetime)

注意:DateOfAction 是一个 varchar 字段

有人可以解释一下并给出正确的代码吗?

【问题讨论】:

  • 你能举个例子DateOfAction的内容吗?我还假设 SS 2008?
  • DateOfAction 的例子是 '20091102', '20100228'.. 这些存储为 varchar。并且一些数据是'NULL'值。我收到的错误消息:“消息 242,级别 16,状态 3,第 1 行将 varchar 数据类型转换为日期时间数据类型导致值超出范围。警告:空值被聚合消除或其他 SET 操作。”非常感谢。

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


【解决方案1】:

可能是因为您的 VARCHAR 字段包含的值可能会转换为 DATE(无时间值),但不是 SQL Server CAST 和 CONVERT 支持的任何有效支持格式。

由于您没有提供任何数据样本,我们只能猜测.....

查看CAST and CONVERT 上的 SQL Server 联机丛书,了解所有将转换为 DATETIME 的受支持的有效格式。

【讨论】:

    【解决方案2】:

    对于导致日期时间问题的某些值,Date 具有“固定”行为。

    例如 yyyy-mm-dd 即使 ISO 也不是语言安全的

    this article by Tibor Karaszi。还有this SO question(在 cmets 中)

    【讨论】:

      【解决方案3】:

      编辑

      遵循您正在使用的其他信息 yyyymmdd 格式我只能认为问题出在数据上。 您可以尝试以下方法吗?

      每个值都是你认为的格式吗?

       SELECT DateOfAction 
       FROM ResAdm.Action 
       WHERE DateOfAction NOT LIKE '[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]'
      

      datetime 可以接受范围内的每个值吗?

      SELECT DateOfAction 
      FROM ResAdm.Action 
      WHERE cast(DateOfAction as DATE) < '17530101'
      

      【讨论】:

      • 此代码工作:SELECT P.RecClassID, B.BranchName, P.PersonID, (SELECT MIN(CAST(A.DateOfAction AS Date)) AS Expr1 FROM ResAdm.Action A WHERE (A.PersonID = P.PersonID)) AS PeriodFrom, (SELECT MAX(CAST(A.DateOfAction AS Date)) AS Expr1 FROM ResAdm.Action A WHERE (A.PersonID = P.PersonID)) AS PeriodTo FROM ResAdm.Person P INNER JOIN ResAdm .Action A ON P.PersonID = A.PersonID INNER JOIN ResAdm.Branch_Codes B ON P.BranchID = B.BranchID
      • 嗨,马丁,我在运行第一条 sql 语句时发现了 30 条记录,在第二条中发现了 31 条记录。接下来我该怎么办??
      • 好吧,在这种情况下,您似乎需要修复您的数据,因为看起来您的数据比它早了 31 个日期。
      • 我已经修复了我们数据库中的数据,所以问题现在解决了。非常感谢马丁的帮助。祝你在编程的未来一切顺利。 -- 谢里夫
      【解决方案4】:

      除了指出日期具有某些安全转换但不适用于日期时间的其他答案之外,还有一个事实是 range of date is larger than that for datetime.因此,如果您的日期早于 1753 年,则任何格式化/转换都不起作用。


      另外,如果这不是为了将代码转换为在旧服务器上工作,而只是为了获得时间组件,那么如果您的服务器上有 date 可用,那么您应该有 datetime2,它效果会好很多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 2010-09-23
        • 2014-01-04
        • 2011-08-25
        • 2019-08-26
        • 1970-01-01
        • 2017-11-29
        • 2010-09-09
        相关资源
        最近更新 更多