【发布时间】:2021-09-14 04:27:39
【问题描述】:
我正在针对 SQL Server 2016 使用 SQL Server Management Studio 18。我有一些分批的材料,这些批次的到期日期以字符串形式保存,但基本上采用“年月日”的格式,例如'20210312' 表示 2021 年 3 月 3 日。我的目标是只查看在当前日期之后过期的材料。每当我尝试在 WHERE 子句中将到期日期列转换为日期时,我都会收到此错误:
从字符串转换日期和/或时间时转换失败
(或尝试不同方法时类似的东西)。
所以,现在我的代码如下所示:
SELECT MaterialColumn, BatchColumn, CAST(ExpirationColumn AS DATE)
FROM StockTable
WHERE CAST(ExpirationColumn AS DATE) > CAST(GETDATE() AS DATE)
如果我不执行 WHERE 子句,我知道我可以毫无问题地将 ExpirationColumn 转换为 DATE,但是当它位于 WHERE 子句中时,我会遇到该错误。有什么方法可以过滤以仅查看我想要的日期?
【问题讨论】:
-
这能回答你的问题吗? How to parse string into date?
-
您可以尝试的 Google 搜索是“tsql 将字符串转换为日期时间”
-
使用
TRY_CONVERT,如果转换失败但不会使语句失败,它将返回NULL。它还可以让您查看哪些行未通过转换,以便您可以进行其他检查。SELECT * FROM StockTable WHERE TRY_CONVERT(DATE, ExpirationColumn) IS NULL;如果您无法更改数据源以使用实际日期类型而不是字符串。 -
"我在 Microsoft SQL server studio 18" SSMS 是一个 IDE,它不会告诉我们您正在使用的 SQL Server 版本的任何信息(SSMS 18 支持SQL Server 2008-2019)。 “以字符串形式保存的到期日期” this 是您真正的问题,即设计。修复设计,修复问题。停止将日期存储为字符串,那 不是 字符串。您的尝试失败的原因很可能是因为您的表中有错误数据,例如
20211309、202111919或20210229。 -
@squillman 这样做似乎不会返回任何 NULL 值。所有到期日期似乎都变成了“00000000”。
标签: sql sql-server sql-date-functions