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
中的 varchar
与 date
.
具有相同的排序顺序
因此,您只需将 GETDATE
转换为正确的格式:
WHERE Expiration > CONVERT(varchar(8), GETDATE(), 112)
当然,这不会改变我在评论中的陈述;修复您的设计,不要将日期存储为字符串,而是存储为日期(和时间)数据类型。
我正在使用 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
中的 varchar
与 date
.
因此,您只需将 GETDATE
转换为正确的格式:
WHERE Expiration > CONVERT(varchar(8), GETDATE(), 112)
当然,这不会改变我在评论中的陈述;修复您的设计,不要将日期存储为字符串,而是存储为日期(和时间)数据类型。