我使用SQL Server Management Studio 18对SQL Server 2016。我有一些成批的材料,这些成批的材料都有截止日期,它们以字符串的形式保存,但基本上都是"年、月、日"的格式,例如:'20210312'为2021年3月3日。我的目标是只看到在当前日期之后到期的材料。每当我尝试在WHERE子句中将过期日期列CAST为date时,就会得到以下错误:
从字符串
转换日期和/或时间时转换失败
(或在尝试不同方法时类似的内容)。
所以,现在我的代码是这样的:SELECT MaterialColumn, BatchColumn, CAST(ExpirationColumn AS DATE)
FROM StockTable
WHERE CAST(ExpirationColumn AS DATE) > CAST(GETDATE() AS DATE)
如果我不执行WHERE子句,我知道我可以将ExpirationColumn CAST为DATE而不会出现问题,但是当它在WHERE子句中时,我就会遇到该错误。有什么方法可以让我只看到我想要的日期吗?
您可以使用try_cast()
:
SELECT MaterialColumn, BatchColumn, CAST(ExpirationColumn AS DATE)
FROM StockTable
WHERE TRY_CAST(ExpirationColumn AS DATE) > CAST(GETDATE() AS DATE);
你也可以找到坏值:
SELECT ExpirationColumn
FROM StockTable
WHERE TRY_CAST(ExpirationColumn AS DATE) IS NULL AND ExpirationColumn IS NOT NULL;
听起来你可能需要修复一些数据值。
老实说,如果您的日期都以yyyyMMdd
格式存储,那么就不需要转换。相反,使用varchar
参数,因为(至少)yyyyMMdd
格式的varchar
与date
具有相同的排序顺序。
因此,您只需将GETDATE
转换为正确的格式:
WHERE Expiration > CONVERT(varchar(8), GETDATE(), 112)
当然,这不会改变我在评论中的陈述;修改你的设计,不要将日期存储为字符串,而是存储为日期(和时间)数据类型。