2013-05-06 56 views
1

我想在给定的一天中提取30分钟的时间间隔。在一天中提取时间间隔

对于例如:如果我指定的日期为2013年5月6日,然后我想要的输出:

Day     Interval 
05/06/2013   0000-0030 
05/06/2013   0030-0100 
05/06/2013   0100-0130 
05/06/2013   0130-0200 
05/06/2013   0200-0230 
----------   --------- 
----------   --------- 
05/06/2013   2300-2330 
05/06/2013   2330-0000 

我怎样才能得到呢?

+0

输出混乱。应该有'0030-0100'线吗? – 2013-05-06 18:52:28

+0

@DavidStarkey是 – peter 2013-05-06 18:55:04

+0

因此,您希望夏令时的日期有23小时和25小时,或者日期为什么重要? – 2013-05-06 18:55:30

回答

0

在这里雅去,不是非常优雅,我会承认。如果您需要经常这样做,最好创建一个表格并像Pondlife所建议的那样添加值。

declare @date date 
set @date = current_timestamp 

declare @table table (dt date, interval varchar(10)) 
declare @interval time 
set @interval = '00:00' 
while @interval < '23:29' 
begin 
    insert into @table (dt,interval) 
    select @date, 
     right('0000' + 
      substring(convert(varchar,@interval),1,2) + 
      substring(convert(varchar,@interval),4,2),4) 
     + '-' + 
     right('0000' + 
      substring(convert(varchar,dateadd(minute,30,@interval)),1,2) + 
      substring(convert(varchar,dateadd(minute,30,@interval)),4,2),4) 
    set @interval = dateadd(minute,30,@interval) 
end 

insert into @table (dt,interval) 
select @date, '2330-0000' 

select * 
from @table 
0

这是一个使用内联表值函数的解决方案,您可以重复使用该函数来获取任意间隔的日期所需的任何范围。您可以通过将日期时间转换为字符串并在其上使用字符串函数来导出所需的确切输出。

--A function that returns all intervals between start and end 
CREATE FUNCTION GetTimeIntervals 
( 
    @intervalMinutes int 
    ,@startDateTime datetime 
    ,@endDateTime datetime 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH cSequence AS 
    (
    SELECT 
     @startDateTime AS C_StartDateTime 
     ,DATEADD(minute, @intervalMinutes, @startDateTime) AS C_EndDateTime 

    UNION ALL 
    SELECT 
     C_EndDateTime AS C_StartDateTime 
     ,DATEADD(minute, @intervalMinutes, C_EndDateTime) AS C_EndDateTime 
    FROM cSequence 
    WHERE DATEADD(minute, @intervalMinutes, C_EndDateTime) <= @endDateTime 
    ) 
    select C_StartDateTime, C_EndDateTime FROM cSequence 
); 

GO 
--Example implementation 
DECLARE @times TABLE (Id INT IDENTITY(1,1),time1 DATETIME,time2 DATETIME); 
INSERT INTO @times VALUES ('2013-05-07 08:00','2013-05-07 10:00'),('2013-05-08','2013-05-09') 
DECLARE @Interval INT = 30; 

SELECT 
Id 
,fn.C_StartDateTime 
,fn.C_EndDateTime 
,REPLACE(RIGHT(CONVERT(VARCHAR(16),fn.C_StartDateTime,121),5)+'-'+RIGHT(CONVERT(VARCHAR(16),fn.C_EndDateTime,121),5),':','') AS Interval 
FROM @times AS t 
CROSS APPLY GetTimeIntervals(@Interval,time1,time2) AS fn 
OPTION(MAXRECURSION 0)