我写了一个存储过程,它接受一个引用日期,并为这个元素添加一个小时。
这是我执行操作的行:
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
答案 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)