SQL,将字符串转换为日期,以便我可以使用GETDATE()



我使用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格式的varchardate具有相同的排序顺序。

因此,您只需将GETDATE转换为正确的格式:

WHERE Expiration > CONVERT(varchar(8), GETDATE(), 112)

当然,这不会改变我在评论中的陈述;修改你的设计,不要将日期存储为字符串,而是存储为日期(和时间)数据类型。

相关内容

  • 没有找到相关文章

最新更新