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

SQL, casting a string to date so I can use GETDATE()

我正在使用 SQL Server Management Studio 18 针对 SQL Server 2016。我有一些 material 是分批的,这些批次的到期日期作为字符串保存,但基本上都是'yearmonthday'的格式,例如2021 年 3 月 3 日的“20210312”。我的目标是只查看在当前日期之后到期的 material。每当我尝试在 WHERE 子句中将到期日期列转换为 DATE 时,我都会收到此错误:

Conversion failed when converting date and/or time from character string

(或尝试不同方法时的类似内容)。

所以,现在我的代码如下所示:

SELECT MaterialColumn, BatchColumn, CAST(ExpirationColumn AS DATE)
FROM StockTable
WHERE CAST(ExpirationColumn AS DATE) > CAST(GETDATE() AS DATE)

如果我不执行 WHERE 子句,我知道我可以毫无问题地将 ExpirationColumn 转换为 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)

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