【问题标题】:SQL Server datetime in format yyyy-mm-ddThh:mi:ss.mmmZSQL Server 日期时间格式为 yyyy-mm-ddThh:mi:ss.mmmZ
【发布时间】:2018-02-21 22:43:17
【问题描述】:

对于 XML 消息,我需要 SQL Server 2008 R2 来选择以下格式的一组日期:

yyyy-mm-ddThh:mi:ss.mmmZ

我在 Google 和 Stack Overflow 上搜索了一下,得到了以下解决方案:

SELECT STUFF(CONVERT(VARCHAR(50), CAST(GETDATE() AS DATETIMEOFFSET), 127),24,4,'')

除了日期的毫秒为“000”的情况外,这一切正常。在这种情况下,它会选择 NULL。

您能帮我找到一个同样适用于毫秒为“000”的日期的解决方案吗?

您可以使用以下代码进行操作:

declare @timestamps table (
 i int,
 timestamp datetime
 )

insert into @timestamps (i, timestamp)
values
(1, '2017-09-13 01:00:00.003'),
(2, '2017-09-13 02:00:00.333'),
(3, '2017-09-13 03:00:00.000'),
(4, '2017-09-13 04:00:00')

select i, timestamp, STUFF(CONVERT(VARCHAR(50), CAST(timestamp AS DATETIMEOFFSET), 127),24,4,'') from @timestamps

【问题讨论】:

  • 这还不够吗:select i, timestamp, CONVERT(varchar(50), timestamp, 127) FROM @timestamps
  • 我首先尝试了这个,但是 - 根据 MS SQL 文档中的内容 - 它没有在末尾显示“Z”(时区偏移)。所以你的例子的输出是2017-09-13T01:00:00.003而不是2017-09-13T01:00:00.003Z

标签: sql sql-server sql-server-2008 datetime format


【解决方案1】:

您可能需要使用相同的代码格式,但创建一个 case 语句用于 when milliseconds = 0

【讨论】:

  • 这似乎工作正常。也许有一个更优雅的解决方案来解决这个问题?在将此标记为“正确”答案之前,我将等待更多回复。这是我使用的代码:select case when DATEPART(millisecond,timestamp) = 0 then CONVERT(VARCHAR(50), CAST(timestamp AS DATETIMEOFFSET), 127) else STUFF(CONVERT(VARCHAR(50), CAST(timestamp AS DATETIMEOFFSET), 127),24,4,'') end from @timestamps
【解决方案2】:

据我了解,您正在使用 stuff() 来消除小数点后第三位的毫秒数。

相反,您可以将datetimeoffset 的精度指定为(3),而不是让它默认为(7)

select 
    i
  , dto3 = convert(varchar(32),convert(datetimeoffset(3),timestamp),127)
  , plusZ = convert(varchar(32),timestamp,127)+'Z' --without converting to datetimeoffset
  -- /* SQL Server 2012+ */, tsFormat = format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ')
from @timestamps

rextester 演示:http://rextester.com/VKXBET35937

返回:

+---+--------------------------+--------------------------+
| i |           dto3           |          plusZ           |
+---+--------------------------+--------------------------+
| 1 | 2017-09-13T01:00:00.003Z | 2017-09-13T01:00:00.003Z |
| 2 | 2017-09-13T02:00:00.333Z | 2017-09-13T02:00:00.333Z |
| 3 | 2017-09-13T03:00:00Z     | 2017-09-13T03:00:00Z     |
| 4 | 2017-09-13T04:00:00Z     | 2017-09-13T04:00:00Z     |
| 5 | 2017-09-13T14:12:34.567Z | 2017-09-13T14:12:34.567Z |
+---+--------------------------+--------------------------+

在 SQL Server 2012+ 中,上述方法同样有效,但如果您希望毫秒内始终为 0,您可以使用 format()

format(timestamp,'yyyy-MM-ddTHH:mm:ss.fffZ')

但是format()可能会慢一些,看看这里:format() is nice and all, but… - Aaron Bertrand

【讨论】:

  • 非常感谢!你的第一个建议正是我想要的!是的,我用STUFF() 截断了小数点后第三位的毫秒数。我不知道datetimeoffset 函数的“小数秒精度”参数。
  • @Malawirel 乐于助人! -- 你在使用 datetimeoffset 与仅使用 convert(varchar(32),timestamp,127)+'Z' 方面有什么不同吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多