【问题标题】:SQL Server Converting int to DateSQL Server 将 int 转换为日期
【发布时间】:2013-12-11 21:03:28
【问题描述】:

我有一个场景,我有一个 int 列,其中包含以下日期,例如:

20131210

20131209

我想要的是,我想将上面的内容转换为日期数据类型,以便可以将它与 GETDATE() 函数一起使用。 这是我的尝试,但出现错误:

SELECT CONVERT(DATETIME, CONVERT(varchar(8), MyColumnName))
FROM MyTable
WHERE DATEADD(day, -2, CONVERT(DATETIME, CONVERT(CHAR(8), MyColumnName))) < GetDate()

这是我得到的错误:

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

【问题讨论】:

  • 如果值为 int,请尝试 SELECT CAST(CAST(20131210 AS VARCHAR(12)) AS DATE)。很烦人,但它适用于我的 2012 年。
  • 尝试拆分字符串。

标签: sql-server casting


【解决方案1】:

您的专栏中至少有一个错误的日期(可能是9999999920130231 或谁知道)。当您选择错误的数据类型时,就会发生这种情况。您可以使用以下方法识别坏行:

SELECT MyColumnName FROM dbo.MyTable
  WHERE ISDATE(CONVERT(CHAR(8), MyColumnMame)) = 0;

然后您可以修复它们或删除它们。

一旦你这样做了,你应该修理桌子。将日期存储为整数绝对没有任何好处,还有很多缺点。

一旦您以正确的格式存储日期,您的查询就会简单得多。而且我强烈建议将函数等应用于谓词的右侧,而不是将其应用于列(这会破坏 SQL Server 有效利用该列上的任何索引的能力,如果这是常见的查询模式)。

SELECT MyColumnName
  FROM dbo.MyTable
  WHERE MyColumnName < DATEADD(DAY, 2, GETDATE());

【讨论】:

    【解决方案2】:

    试试:

    CREATE TABLE IntsToDates(
        Ints INT
    )
    
    INSERT INTO IntsToDates
    VALUES (20131210)
        , (20131209)
    
    SELECT CAST(CAST(Ints AS VARCHAR(12)) AS DATE)
    FROM IntsToDates
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,我需要将 INT 转换为 DATE 并且需要满足 0 的值。这个 case 语句对我有用

      CASE MySourceColumn
         WHEN ISDATE(CONVERT(CHAR(8),MySourceColumn)) THEN   CAST('19000101' AS DATE) 
         ELSE  CAST(CAST(MySourceColumn AS CHAR) AS DATE) 
        END
        AS MyTargetColumn
      

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 2012-11-04
        相关资源
        最近更新 更多