我有一个dd.hh:mm:ss.nnnnn
格式的值。其中一些例子是32.11:45:40.93877
,11:45:30.32012
,它们是字符串格式的。
我想要添加一个日期时间值和时间跨度以上的执行加法,这是字符串格式。30.12:43:10.98222
值可以表示为30天、12小时、43分钟、10秒和98222毫秒。
我编写了以下代码(函数)以获得结果:
伪码:
split the string split(5.11:45:40.90399, ':') and add into #temptable(id, value).
while(0 < @counter)
select @val = value from #tempTable where id = @counter
if (@counter = 0)
split '5.11' in 5 and 11 by using charindex, substring, left, Convert to Int function. Also handle availability of day value
datetimevalue = dateadd(day,5,datetimevalue)
datetimevalue = dateadd(hour, 11, datetimevalue)
if (@counter = 1)
datetimevalue = dateadd(minute, 45, datetimevalue)
if (@@counter = 2)
split 40.90399 into 40 and 90399
datetimevalue = dateadd(second, 40, datetimevalue)
datetimevalue = dateadd(millisecond, 90399, datetimevalue)
End of while loop
return datetimevalue
我们能有一个替代的解决方案或一些改变简化上述过程吗?
目前,我正在考虑将hh:mm:ss
部件转换为秒,并将其添加为秒,从而减少对dateadd函数的调用。
发布于 2016-06-20 16:42:17
首先,要获得不能使用DateTime
的精度,必须使用DateTime2
。
第二,正如Mayur正确的评论--您想要添加的值是时间跨度,而不是日期时间值。但是,在Sql server中不存在时间跨度数据类型,但是可以使用一些字符串操作将字符串值转换为时间跨度。
但是,我想出了一个建议的解决方案,但是这个解决方案有一个问题我无法解决:您的毫秒部分可能大于1000 (事实上是这样),所以结果似乎有点不太理想。我试过把它当作纳秒来处理,但这并没有给出我期望的结果。也许其他人可能会改进它,或者想出一个更好的方法来实现它:
首先,将时间从时间中分离出来,然后,将时间分离到它的组件中,然后,使用DateAdd将所有时间添加到原始日期:
DECLARE @Date datetime2 = GETDATE()
DECLARE @S as varchar(20) = '32.11:45:40.93877'
;WITH CTE1 As
(
SELECT LEFT(@S, CHARINDEX('.', @S)-1) As TheDay,
REPLACE(SUBSTRING(@S, CHARINDEX('.', @S) + 1, LEN(@S) - CHARINDEX('.', @S)), ':', '.') As TheTime
), CTE2 AS
(
SELECT CAST(TheDay As int) As TheDays,
CAST(PARSENAME(TheTime, 4) As Int) As TheHours,
CAST(PARSENAME(TheTime, 3) As Int) As TheMinutes,
CAST(PARSENAME(TheTime, 2) As Int) As TheSeconds,
CAST(PARSENAME(TheTime, 1) As Int) As TheNanoSeconds
FROM CTE1
)
SELECT @Date As OriginalDate,
@S As TimeSpan,
DATEADD(DAY, TheDays,
DATEADD(HOUR, TheHours,
DATEADD(MINUTE, TheMinutes,
DATEADD(SECOND, TheSeconds,
DATEADD(NANOSECOND, TheNanoSeconds, @Date)
)
)
)
) As Result
FROM CTE2
结果:
OriginalDate TimeSpan Result
--------------------------- -------------------- ---------------------------
2016-06-20 16:23:30.7470000 32.11:45:40.93877 2016-07-23 04:09:10.7470939
https://stackoverflow.com/questions/37926852
复制相似问题