【发布时间】: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