Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL获取时间范围之间的时间值_Sql_Sql Server_Time - Fatal编程技术网

SQL获取时间范围之间的时间值

SQL获取时间范围之间的时间值,sql,sql-server,time,Sql,Sql Server,Time,我必须根据SQL存储过程中日期的特定时间间隔计算特定开始时间和结束时间之间的所有时间值 我的存储过程有4个参数 @date_value nvarchar(1000),//date value'2016-10-09' @starttime TIME(0) //= '08:00',//suppose starttime is 8am @endtime TIME(0) //= '13:00' @interval INT //= '20' //20 minutes 我正在尝试获取starttime和e

我必须根据SQL存储过程中日期的特定时间间隔计算特定开始时间和结束时间之间的所有时间值

我的存储过程有4个参数

@date_value nvarchar(1000),//date value'2016-10-09'
@starttime TIME(0) //= '08:00',//suppose starttime is 8am
@endtime TIME(0) //= '13:00'
@interval INT //= '20' //20 minutes
我正在尝试获取starttime和endtime之间的所有时间值。我需要这样的。 8:00,8:20,08:40…….高达12:50我不需要的结束值

我在谷歌上搜索了一下,发现我们可以使用

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime)
这里我不能包括结束时间。请帮助我这里有一种没有循环或递归的方法

DECLARE @date_value nvarchar(1000) = '2016-10-09'
DECLARE @starttime TIME(0) = '08:00'
DECLARE @endtime TIME(0) = '13:00'
DECLARE @interval INT = '20' 

DECLARE @IterateTime AS TIME(0) = @starttime
DECLARE @Diff AS INT = (SELECT DATEDIFF(MINUTE, @starttime, @endtime)) / @interval
DECLARE @Iterator AS INT = 0


WHILE @Iterator < @Diff
BEGIN
SELECT @IterateTime = DATEADD(MINUTE, @interval, @IterateTime)
SELECT @Iterator = @Iterator + 1
SELECT @IterateTime
END
注意:如果您不使用SQL SERVER 2012+,则使用+进行连接,而不是使用Concat函数



注意:如果未使用SQL SERVER 2012+,则使用+进行连接而不是使用Concat函数

是否需要结果作为逗号分隔符值??我需要它为每个值指定不同的行?是否需要结果作为逗号分隔符值??我需要它为每个值指定不同的行,而不是递归。我会帮你的。谢谢你的帮助advice@Techy,我想会对你有用。比递归更好。我会帮你的。谢谢你的帮助advice@Techy,我想会对你有用。我也需要开始时间,只需添加开始时间,你的输出格式不清楚,所以更新问题,从上面的查询中进行任何更改,我得到的结果是08:20,08:40…我也需要08:00。这应该是第一行,我已经在答案中包含了陈述;选择@starttime as stime UNIONSorry bro,这是错误的..包括上面的语句给了我重复的值我也需要开始时间,只需添加开始时间,您的输出格式不清楚,因此更新问题以获得上述查询的任何更改我得到的结果为08:20,08:40….我也需要08:00。这应该是第一行,我已在答复中包括了这一陈述;选择@starttime作为stime UNIONSorry bro,这是错误的..包括上面的语句会给我重复的值
Declare
@date_value nvarchar(1000)='2016-10-09',
@starttime TIME(0)= '08:00',
@endtime TIME(0) = '13:00',
@interval INT = '20' 



;With cte(stime)
as
(
SELECT 
cast(cast( @date_value as datetime)
  + CONVERT(CHAR(8), @starttime, 108) as time)
union all
select
 cast(dateadd(minute,@interval,stime) as time)
from cte
where cast(dateadd(minute,@interval,stime) as time)<@endtime 
)
select * from cte
;with cte as
(
SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n as seq
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
     (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
),time_gen as 
(
SELECT Dateadd(MINUTE, @interval * seq , Cast(Concat(@date_value, ' ', @starttime) AS DATETIME)) as dates
FROM   cte
)
select cast(dates as time) times from time_gen
WHERE  dates < Cast(Concat(@date_value, ' ', @endtime) AS DATETIME)
order by times