MS SQL - 将字符串 mm/dd 转换为日期

Dan*_*nar 0 sql-server datetime

我在 MS SQL 中将字符串转换为日期有点困难。希望你能指导我。

这是我的场景:

我的表中有一个名为 ExpDt 的列。它是产品的保质期。格式为 mm/dd。

现在我想知道什么产品会在 5 天前过期。所以我要做一个datediff。但问题是 ExpDt 列不是有效日期。如何将其转换为有效日期?

因此输出将类似于:2018-01-20,这是一个有效日期。不是字符串。

这是我尝试过的。

-- Outputs 2018-01-31
-- select  @expDate = cast(datepart(year, getdate()) as nvarchar(5)) 
-- + '-' + substring(ExpDt, 1, 2) 
-- + '-' + substring(ExpDt, 4, 5)

-- from BigEMerchandiser.dbo.tbl_Abis_D
Run Code Online (Sandbox Code Playgroud)

它返回一个字符串,但我无法使用 convert 函数将其转换为日期。我将附上表格的屏幕截图,以便您可以看到 ExpDt 列的数据。希望我清楚地解释了自己。任何帮助将非常感激。谢谢你。

结果集

Joe*_*ish 5

您能做的最好的事情是修复您的表格,以便您存储日期而不是字符串。话虽如此,您在问题中发布的代码走在正确的轨道上。问题是您将其保留为字符串,而没有将其显式转换为DATETIME. 根据数据类型优先规则,您过滤的数据也会转换为您不想要的字符串。

如果您想保留该SUBSTRING方法,则可以尝试以下操作:

CREATE TABLE #T (NOT_A_DATE NVARCHAR(5));

INSERT INTO #T VALUES (N'01/30'), (N'01/31');

SELECT
    DATEFROMPARTS(
      datepart(year, getdate())
    , substring(NOT_A_DATE, 1, 2) 
    , substring(NOT_A_DATE, 4, 5)
)
FROM #t;
Run Code Online (Sandbox Code Playgroud)

关键是使用DATEFROMPARTS函数将字符串转换为在所有语言环境中都是安全的日期。