数据操作

时间:2015-10-14 12:55:49

标签: sql sql-server tsql

我写了一个存储过程,它接受一个引用日期,并为这个元素添加一个小时。

这是我执行操作的行:

DATEADD(day, DATEDIFF(DAY, 0, @conductor_date), [HOUR])

例如,@conductor_date = '2015-10-15'[HOUR] = 23:00有效并生成类似日期:'2015-10-15:23:00:00'

当值[HOUR]超过24时,我遇到了一个逻辑问题。事实上,要解决我的问题,我需要在'2015-10-16:00:40:00'

时生成[HOUR] = 24:40

Actualy使用此值,我面临逻辑以下异常:

  

导致将varchar数据类型转换为日期时间数据类型   在超出范围的价值。

总而言之,我需要照顾超过 59'并切换到第二天:

DECLARE    @conductor_date datetime
DECLARE    @hour varchar(5)
SET @conductor_date = '2015-10-15'
SET @hour = '24:40'

SELECT DATEADD(day, DATEDIFF(DAY, 0, @conductor_date), @hour)

预期:2015-10-16:00:40:00

3 个答案:

答案 0 :(得分:1)

根据documentation,日期/时间类型不支持时间大于23:59:59.9999999。你必须为此进行手动字符串解析。

首先,您需要提取总小时数,将其除以24以获得总天数。然后计算剩余时间,然后重建你的时间偏移量。

掌握了这些功能后,您可以构建所需的输出值:

DECLARE @v VARCHAR(20) = '24:40'
DECLARE @start VARCHAR(20) = '2015-10-15'

DECLARE @days INT
DECLARE @leftover INT

SET @leftover = CAST(LEFT(@v, 2) AS INT)
SET @days = @leftover / 24
SET @leftover = @leftover - @days * 24

SET @v = CAST(@leftover AS VARCHAR(2)) + SUBSTRING(@v, 3, 20)

SELECT DATEADD(DAY, @days + DATEDIFF(DAY, 0, @start), @v)

这是一个有效的SQLFiddle

这支持以HH(前导零)开头且具有任何有效精度的时间字符串(HH:mm:ss.fffffff)。

答案 1 :(得分:0)

您可以将@hour字段拆分为小时和分钟,然后单独添加:

DECLARE    @conductor_date datetime 
DECLARE    @hour varchar(5) 

DECLARE @hours int
DECLARE @minutes int
DECLARE @offset datetime

SET @conductor_date = '2015-10-15' 
SET @hour = '24:40'

SET @hours = cast(left(@hour, 2) as int)
SET @minutes = cast(right(@hour, 2) as int)
SET @offset = dateadd(day, datediff(day, 0,@conductor_date), 0) -- the begin of the day

SELECT DATEADD(hour, @hours, dateadd(minute, @minutes, @offset))

当然,所有这些都可以在一行中完成,但为了可视化,我把它放在单独的陈述中。

答案 2 :(得分:0)

您可以尝试以下查询

SELECT DATEADD(MINUTE,(LEFT(@hour,2)*60+RIGHT(@hour,2)),@conductor_date)