SQL 日期转换 HHMMSS.CCCNNNNNN 到 yyyy-mm-dd hh:mi:ss.mmm
Posted
技术标签:
【中文标题】SQL 日期转换 HHMMSS.CCCNNNNNN 到 yyyy-mm-dd hh:mi:ss.mmm【英文标题】:SQL date conversion HHMMSS.CCCNNNNNN to yyyy-mm-dd hh:mi:ss.mmm 【发布时间】:2018-05-30 16:52:09 【问题描述】:我有这种格式的数据:114643.052303537 (HHMMSS.CCCNNNNNN)。
我需要将其转换为这种格式:2018-04-25 12:40:59.573 (yyyy-mm-dd hh:mi:ss.mmm),去掉日期部分(即 2018-04-25)并计算两种格式的时间差。
你能帮忙吗?
【问题讨论】:
提供你目前尝试过的,为什么标签里有“C”? 目前还不清楚114643
部分如何变成12:40:59
。也不清楚“计算两种格式之间的时间差”是什么意思。 “两个值之间的差异”是有道理的。但是将值从一种格式转换为另一种格式不应该改变时间,除非精度会丢失。
2018-04-25 12:40:59.573 是 084059.348708957(相差 4 小时)。
我认为你的措辞混淆了这个问题。您不应该谈论转换,如果我理解正确,您只需要两种不同格式之间的时间差。你想要什么格式的差异?根据样本数据,期望的结果是什么?
现在你让我更加困惑了。 084059 是从哪里来的?
【参考方案1】:
我需要hh:mi:ss.mmm格式的时差
获得此值的方法是将 BOTH 值转换为毫秒(仅查看具有日期的值的时间部分);通过简单的减法计算差值,然后通过除法和模运算将结果转换为 hh:mi:ss.mmm。
【讨论】:
【参考方案2】:declare @dt datetime = '2018-04-25 12:40:59.573'
declare @dunno varchar(16) = '114643.052303537'
从日期时间中去掉日期并给出今天的日期
getdate() + right(convert(varchar,@dt,113),12)
将 varchar 转换为时间并给出今天的日期
getdate() + left(stuff(stuff(@dunno,3,0,':'),6,0,':'),8)
找出它们之间的毫秒数
datediff(millisecond,getdate() + left(stuff(stuff(@dunno,3,0,':'),6,0,':'),8),getdate() + right(convert(varchar,@dt,113),12))
按照你的格式把它们放在一起
select
convert(char(13),
dateadd(millisecond,
datediff(millisecond,getdate() + left(stuff(stuff(@dunno,3,0,':'),6,0,':'),8),getdate() + right(convert(varchar,@dt,113),12)),
'01/01/00'),
14)
根据您的服务器和其他代码的速度,明智的做法是在开头使用 GETDATE()
的变量,以防止转换过程中出现毫秒甚至秒的差异。
declare @dt datetime = '2018-04-25 12:40:59.573'
declare @dunno varchar(16) = '114643.052303537'
declare @today datetime = getdate()
declare @dunno2 datetime
declare @dt2 datetime
set @dt2 = @today + right(convert(varchar,@dt,113),12)
set @dunno2 = @today + left(stuff(stuff(@dunno,3,0,':'),6,0,':'),8)
select
convert(char(13),
dateadd(millisecond,
datediff(millisecond,@dunno2,@dt2),
'01/01/00'),
14)
【讨论】:
以上是关于SQL 日期转换 HHMMSS.CCCNNNNNN 到 yyyy-mm-dd hh:mi:ss.mmm的主要内容,如果未能解决你的问题,请参考以下文章