【问题标题】:SQL, casting a string to date so I can use GETDATE()SQL,将字符串转换为日期,以便我可以使用 GETDATE()
【发布时间】: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 是您真正的问题,即设计。修复设计,修复问题。停止将日期存储为字符串,那 不是 字符串。您的尝试失败的原因很可能是因为您的表中有错误数据,例如 2021130920211191920210229
  • @squillman 这样做似乎不会返回任何 NULL 值。所有到期日期似乎都变成了“00000000”。

标签: sql sql-server sql-date-functions


【解决方案1】:

您可以改用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;

听起来您可能需要修复一些数据值。

【讨论】:

  • 这似乎奏效了!这只是好奇,因为我没有看到任何空值。
  • 您还有其他过滤器吗? StockTable 可以是视图吗?
【解决方案2】:

老实说,如果您的日期 都以 yyyyMMdd 格式存储,则无需转换。而是使用varchar 参数,因为(至少)yyyyMMdd 格式的varchardate 具有相同的排序顺序。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2016-11-21
    • 2011-04-03
    • 2021-11-11
    • 2015-03-19
    • 2015-01-20
    相关资源
    最近更新 更多