首页 > 解决方案 > 将 2017-01-13T06:00:00Z 时间格式转换为 yyyy-mm-dd hh:mm:ss

问题描述

我正在尝试转换时间格式。数据库表的时间以“yyyy-mm-ddThh:mi:ssZ”的格式存储在 VARCHAR(50) 列中。运行查询时,我希望时间格式为“yyyy-mm-dd hh:mi:ss”。(我不关心时区调整。)我不明白为什么风格为 120 的 GETDATE 返回我想要的,但是当我使用字段名时它什么也不做。

SELECT  
  PlateEffectiveFrom as Value_In_Table, 
  STUFF(CONVERT(VARCHAR(33),PlateEffectiveFrom, 120),20,4,'') as 'Gets_Rid_of_Z',  
  CONVERT(varchar(33), PlateEffectiveFrom, 120) AS Does_Nothing,
  CONVERT(varchar(33), GETDATE(), 120) AS Format_I_Want
FROM    dbo.TVLTagDetails13
WHERE   ID = 5

回报:

Value_In_Table          Gets_Rid_of_Z         Does_Nothing           Format_I_Want
2008-03-12T06:00:00Z    2008-03-12T06:00:00   2008-03-12T06:00:00Z   2019-01-08 11:16:41

标签: sqlsql-servertsqltime

解决方案


此问题的解决方案是将列的数据类型更改为DateTime2如果您不需要时区数据,或者DateTimeOffset如果您需要时区数据。假设这无法完成,您所做的是一个简单的字符串操作,以从"yyyy-mm-ddThh:mi:ssZ"to获取"yyyy-mm-dd hh:mi:ss"

SELECT LEFT(REPLACE(PlateEffectiveFrom, 'T', ' '), 19) AS Format_I_Want
FROM dbo.TVLTagDetails13
WHERE ID = 5

此外,在评论中的对话之后 - 必须阅读:Aaron Bertrand 的坏习惯:选择错误的数据类型


推荐阅读