【发布时间】:2020-04-06 11:19:55
【问题描述】:
如何转换存储的日期和时间值
20200406151341
到 DATETIME 值 2020/04/06 15:31:41 (YYYY/MM/DD HH:MM:SS.000)?我找不到合适的 CONVERT() 格式,目前唯一的方法是解析 VARCHAR,如下所示。
select dateadd(second, cast(substring('20200406151341',13,2) as int),dateadd(minute, cast(substring('20200406151341',11,2) as int), dateadd(hour,cast(substring('20200406151341',9,2) as int),convert(datetime, left('20200406151341',8), 112)))).
它可以工作,但很难阅读和理解,尤其是当我必须在 SELECT 语句中多次使用它时。
我也很惊讶上述转换的查询与直接以 DATETIME 格式存储日期的查询一样快。 MSSQL 服务器是否使用某种缓存,所以它必须每行只进行一次转换?
我使用 MSSQL Server 2016。
【问题讨论】:
-
保留您的
substrings,但将它们放在datetimefromparts中。I am surprised query with above conversions is as fast- 找到行后在最终选择中计算标量非常快。 -
最好的办法是将日期时间值存储为数据时间数据类型。如果您无法更改结构,那么我建议您在表中创建一个计算列。
-
或使用视图 - 并准备处理无法转换的值。当架构没有得到太多考虑时,就会发生这种情况。
标签: sql sql-server tsql type-conversion