将nvarchar日持续时间设置转换为datetime

时间:2010-02-26 08:22:16

标签: sql sql-server

我有一个SQL Server函数,可将 nvarchar 日持续时间设置转换为日期时间值。

日期持续时间格式为&gt;天&lt;。&gt;小时&lt ;:&gt;分钟&lt; ,例如 1.2:00 一天两小时。< / p>

日期设置的格式无法更改,我们可以确保所有数据格式正确并且存在。

为功能提供开始时间和日期持续时间设置应该返回结束时间。

例如:2010-01-02 13:30 ==&gt; 2010-01-03 2:00

我正在使用charindex,substring和convert方法的组合来计算值, 这有点慢和笨拙。有没有其他方法可以将此日持续时间设置直接转换为日期时间值?

2 个答案:

答案 0 :(得分:2)

不是我能看到的。我最终会得到类似于你的一些SQL,使用charindex等。不幸的是,这取决于存储日期持续时间的格式。我知道你不能改变它,但如果它是以不同的格式然后它会更容易 - 例如我通常这样做的方法是将持续时间合理化为基本单位,如分钟。

而不是将1.2:00存储1天2小时,而是(1 * 24 * 60)+(2 * 60)= 1560.这可以在原始日期(日期)的直接DATEADD中使用仅部分)。

使用您拥有的格式,我能想到的所有方法都涉及使用CHARINDEX等。

答案 1 :(得分:1)

另一种方法是使用计算来构建字符串。然后,您可以使用sp_executesql运行生成的SQL,并将@enddate指定为输出参数:

declare @startdate datetime
declare @duration varchar(10)
declare @enddate datetime

set @startdate = '2010-01-02 13:30'
set @duration = '0.12:30'

declare @sql nvarchar(max)
set @sql = 'set @enddate = dateadd(mi,24*60*' + 
    replace(replace(@duration,'.','+60*'),':','+') + ', @startdate)'
exec sp_executesql  @sql,
    N'@startdate datetime, @enddate datetime out', 
    @startdate, @enddate out

这将创建一个包含set @enddate = dateadd(mi,24*60*0+60*12+30, @startdate)的字符串,然后运行它。

我怀疑这比常规charindex方式更快:

declare @pos_dot int
declare @day int
declare @hour int
declare @minute int

select 
    @pos_dot = charindex('.',@duration),
    @day = cast(left(@duration, @pos_dot-1) as int),
    @hour = cast(left(right(@duration, 5), 2) as int),
    @minute = cast(right(@duration, 2) as int),
    @enddate = dateadd(mi, 24*60*@day + 60*@hour + @minute, @startdate)