发布
社区首页 >问答首页 >在Server中将dd.hh:mm:ss.nnnnn时间格式添加到日期时间

在Server中将dd.hh:mm:ss.nnnnn时间格式添加到日期时间
EN

Stack Overflow用户
提问于 2016-06-20 15:55:56
回答 1查看 1.5K关注 0票数 0

我有一个dd.hh:mm:ss.nnnnn格式的值。其中一些例子是32.11:45:40.9387711:45:30.32012,它们是字符串格式的。

我想要添加一个日期时间值和时间跨度以上的执行加法,这是字符串格式。30.12:43:10.98222值可以表示为30天、12小时、43分钟、10秒和98222毫秒。

我编写了以下代码(函数)以获得结果:

伪码:

代码语言:javascript
代码运行次数:0
复制
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函数的调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-20 16:42:17

首先,要获得不能使用DateTime的精度,必须使用DateTime2

第二,正如Mayur正确的评论--您想要添加的值是时间跨度,而不是日期时间值。但是,在Sql server中不存在时间跨度数据类型,但是可以使用一些字符串操作将字符串值转换为时间跨度。

但是,我想出了一个建议的解决方案,但是这个解决方案有一个问题我无法解决:您的毫秒部分可能大于1000 (事实上是这样),所以结果似乎有点不太理想。我试过把它当作纳秒来处理,但这并没有给出我期望的结果。也许其他人可能会改进它,或者想出一个更好的方法来实现它:

首先,将时间从时间中分离出来,然后,将时间分离到它的组件中,然后,使用DateAdd将所有时间添加到原始日期:

代码语言:javascript
代码运行次数:0
复制
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 

结果:

代码语言:javascript
代码运行次数:0
复制
OriginalDate                TimeSpan             Result
--------------------------- -------------------- ---------------------------
2016-06-20 16:23:30.7470000 32.11:45:40.93877    2016-07-23 04:09:10.7470939
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37926852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档