pep*_*epr 0 sql t-sql sql-server
我正在导入包含两种替代形式的日期的 CSV 文件,例如:
31. 12. 20197/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)
...但可能有更好的方法。
如果我理解正确的问题,一个可能的解决方案是组合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)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |