我有一个场景,我有一个带有以下日期的int列,例如:
20131210
20131209
我想要的是,我想将上面的内容转换为日期数据类型,以便我可以将它与GETDATE()函数一起使用。 这是我的尝试,但我收到一个错误:
SELECT CONVERT(DATETIME, CONVERT(varchar(8), MyColumnName))
FROM MyTable
WHERE DATEADD(day, -2, CONVERT(DATETIME, CONVERT(CHAR(8), MyColumnName))) < GetDate()
这是我得到的错误:
从字符串转换日期和/或时间时转换失败。
答案 0 :(得分:4)
您的列中至少有一个错误的日期(可能是99999999
或20130231
或者谁知道)。当您选择错误的数据类型时会发生这种情况。您可以使用以下方法识别错误的行:
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