SQL Server将int转换为Date

时间:2013-12-11 21:03:28

标签: sql-server casting

我有一个场景,我有一个带有以下日期的int列,例如:

20131210

20131209

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

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

这是我得到的错误:

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

3 个答案:

答案 0 :(得分:4)

您的列中至少有一个错误的日期(可能是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());

答案 1 :(得分:2)

尝试:

CREATE TABLE IntsToDates(
    Ints INT
)

INSERT INTO IntsToDates
VALUES (20131210)
    , (20131209)

SELECT CAST(CAST(Ints AS VARCHAR(12)) AS DATE)
FROM IntsToDates

答案 2 :(得分:0)

我有一个类似的问题,我需要将INT转换为DATE并需要满足0的值。这个案例陈述为我做了伎俩

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