【问题标题】:Convert 2017-01-13T06:00:00Z time format to yyyy-mm-dd hh:mm:ss将 2017-01-13T06:00:00Z 时间格式转换为 yyyy-mm-dd hh:mm:ss
【发布时间】:2019-01-08 17:25:20
【问题描述】:

我正在尝试转换时间格式。数据库表的时间以“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

【问题讨论】:

  • SQL Server?你说PlateEffectiveFrom 是一个varchar(这本身就很糟糕),但你把它当作已经是一个日期时间了。首先将其转换为日期时间。
  • 您可以对字符串使用字符串数据类型(varchar、nvarchar、...)、对数字使用数字数据类型(int、decimal、..)以及日期/时间数据类型(date, datetime, ...) 用于日期和时间。使用适当的数据类型可以让您比较值、获取最小值和最大值等。这里是 T-SQL(例如 SQL Server)中数据类型的文档:docs.microsoft.com/en-us/sql/t-sql/data-types/…
  • @Andrew 在所有可能的情况下,您应该在应用程序的前端对输出进行格式化,这通常会以具有更易于使用的功能的代码编写。
  • "为什么 varchar 很糟糕?" - 因为有人可以同样轻松地将“下周二”或“法国”存储在您期望找到日期时间的列中。即使您对列有一个非常复杂的检查约束,试图将可能的值约束为“看起来有效”的日期时间数据(不太可能因为它过大),它是否真的有足够的逻辑来防止有人插入 2 月 30 日?
  • @Andrew 问题 #2 - 你希望结果的偏移量是多少?你想要UTC还是当地时间? 在值日期,您的本地偏移量是多少?你必须照顾好夏天的时间。解决方案是通过将nvarchar 列转换为datetimeoffset修复错误。如果所有值都遵循 ISO8601 格式,则更改将是微不足道的。如果没有,您已经有数据损坏问题

标签: sql sql-server tsql time


【解决方案1】:

解决这个问题的方法是,如果不需要时区数据,则将列的数据类型更改为DateTime2,如果需要时区数据,则更改为DateTimeOffset。 假设这不能完成,你要做的是一个简单的字符串操作,从"yyyy-mm-ddThh:mi:ssZ""yyyy-mm-dd hh:mi:ss"

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

此外,跟随 cmets 中的对话 - 必读:Aaron Bertrand 的 Bad habits to kick : choosing the wrong data type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多