SQL Server能否输出2019-02-26T15:59:33.379-05:00格式的DateTime?
在SQL Server中实现指定日期时间格式的方法
当然可以实现这个需求!你要的2019-02-26T15:59:33.379-05:00是带时区偏移的ISO 8601标准格式,在SQL Server里我们可以根据数据类型和版本选择合适的方案,下面给你具体说明:
情况1:字段是datetimeoffset类型(自带时区信息)
如果你的日期字段本身就是datetimeoffset类型(SQL Server 2008及以上支持),那实现起来很简单,有两种常用方式:
方式1:使用FORMAT函数(简单直观)
FORMAT函数可以直接按照指定格式输出,适合小数据量场景:
DECLARE @dtOffset datetimeoffset = '2019-02-26 15:59:33.379 -05:00'; SELECT FORMAT(@dtOffset, 'yyyy-MM-ddTHH:mm:ss.fffzzz') AS FormattedDateTime;
这里的格式符含义:
yyyy-MM-dd:年-月-日T:ISO标准的日期时间分隔符HH:mm:ss.fff:时:分:秒.毫秒(三位)zzz:带冒号的时区偏移(比如-05:00)
方式2:使用CONVERT+STUFF(性能更优)
如果是大数据量查询,FORMAT函数因为依赖.NET框架性能会稍差,推荐用原生SQL函数组合:
DECLARE @dtOffset datetimeoffset = '2019-02-26 15:59:33.379 -05:00'; SELECT STUFF(CONVERT(varchar(30), @dtOffset, 127), 23, 0, ':') AS FormattedDateTime;
解释一下:
CONVERT(varchar(30), @dtOffset, 127)会输出2019-02-26T15:59:33.379-0500(时区偏移不带冒号)STUFF函数在第23位插入冒号,把-0500改成-05:00,刚好符合你的需求
情况2:字段是datetime/datetime2类型(无时区信息)
如果你的日期字段是datetime或datetime2(不带时区),需要先指定目标时区偏移,再格式化:
方式1:FORMAT+SWITCHOFFSET
先把datetime转成datetimeoffset并指定时区偏移,再格式化:
DECLARE @dt datetime = '2019-02-26 15:59:33.379'; -- 转换为-05:00时区的datetimeoffset,再格式化 SELECT FORMAT(SWITCHOFFSET(CAST(@dt AS datetimeoffset), '-05:00'), 'yyyy-MM-ddTHH:mm:ss.fffzzz') AS FormattedDateTime;
方式2:CONVERT+SWITCHOFFSET+STUFF
同样追求性能的话,用原生函数组合:
DECLARE @dt datetime = '2019-02-26 15:59:33.379'; SELECT STUFF(CONVERT(varchar(30), SWITCHOFFSET(CAST(@dt AS datetimeoffset), '-05:00'), 127), 23, 0, ':') AS FormattedDateTime;
注意事项
FORMAT函数从SQL Server 2016开始支持,如果你的版本低于2016,只能用CONVERT+STUFF的方式- 如果需要动态获取当前服务器时区,或者转换其他时区,可以考虑使用
AT TIME ZONE函数(SQL Server 2016+支持),比如把UTC时间转成美国东部时间:SELECT FORMAT(SYSDATETIME() AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time', 'yyyy-MM-ddTHH:mm:ss.fffzzz')
内容的提问来源于stack exchange,提问作者tavishbhagat
相关产品推荐
相关产品推荐

