将日期为“31.12.2019”和“7/2020”的字符串有效转换为日期类型?

pep*_*epr 0 sql t-sql sql-server

我正在导入包含两种替代形式的日期的 CSV 文件,例如:

  • 31. 12. 2019
  • 7/2020

这两种形式可以交替出现在同一列中;因此,解决方案的一部分必须是表单的检测。

由于第二个表格7/2020不包含日期信息,我使用 1 作为当天。

到目前为止,我只使用了使用日期的可预测形式的记录子集。我遵循了该CONVERT()函数的 T-SQL 文档(https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql)。让我们假设@date = '31. 12. 2019'然后完成以下转换:

    CONVERT(date, @date, 104) AS my_date         -- the German form
Run Code Online (Sandbox Code Playgroud)

对于@date = '7/2020'我执行以下操作:

    CONVERT(date, '1/' + @date, 103) AS my_date  -- the British/French form
Run Code Online (Sandbox Code Playgroud)

现在,如果我不知道(预先)@date包含什么形式,如何转换它?

实际上,日期不是@date变量。相反,它是SELECT查询中的字段值——比如说xdate。我希望代码看起来像:

    CASE WHEN /* detect the British/French case */ THEN CONVERT(date, '1/' + xdate, 103)
         WHEN /* detect the German case */ THEN CONVERT(date, xdate, 104)
         ELSE NULL -- this does not happen, anyway...
    END AS my_date
Run Code Online (Sandbox Code Playgroud)

...但可能有更好的方法。

Zho*_*rov 6

如果我理解正确的问题,一个可能的解决方案是组合COALESCE()TRY_CONVERT()

陈述:

SELECT COALESCE(
   TRY_CONVERT(date, xdate, 104), 
   TRY_CONVERT(date, '1/' + xdate, 103)
) AS xdate
FROM (VALUES
   ('31. 12. 2019'),
   ('7/2000'),
   ('wrong date 12/12')
) v (xdate)
Run Code Online (Sandbox Code Playgroud)

结果:

xdate
----------
2019-12-31
2000-07-01
null
Run Code Online (Sandbox Code Playgroud)