在sql中每隔30分钟间隔24小时

时间:2015-02-03 09:36:02

标签: sql sql-server

请问您是否知道如何在ms sql中实现下表:

时间间隔是每30分钟取决于作为参数给出的日期范围。

实施例。日期范围= 02/02/2015 - 2015年3月2日

enter image description here

4 个答案:

答案 0 :(得分:3)

你可以创建一个数字表,然后用它来生成30分钟的间隔,以便添加到开始日期。

declare @fromDate datetime; set @fromDate = '2015-02-02'
declare @toDate datetime; set @toDate = '2015-02-03'

; with cteNumbers as (
    select
        row_number() over (order by o1.object_id, o2.object_id) - 1 as rn
    from
        sys.objects o1
            cross join sys.objects o2
)
select
    dateadd(minute, rn * 30, @fromDate) as DateTimeInterval
from
    cteNumbers
where 
    dateadd(minute, rn * 30, @fromDate) between @fromDate and @toDate
order by 
    DateTimeInterval

答案 1 :(得分:2)

这将按照您的要求填充表格。 正如您所看到的,它只是填充一个表,其中包含变量中的日期,向变量添加30分钟,循环,检查它是否超过结束日期并重新开始或退出。

Declare @dateFrom date,
        @dateTo date,
        @currentDate datetime
Declare @Dates table (date varchar(30))

    Set @dateFrom = '2015-01-01'
    Set @dateTo = '2015-01-02'

    Set @currentDate = Cast(@dateFrom as datetime) + '00:00:00'

While @currentDate < @dateTo
Begin

Insert into @Dates values (Convert(varchar, @currentDate, 120) + ' - ' + Convert(varchar, DATEADD(Mi, 30, @currentDate),108)) 

Set @currentDate = DATEADD(Mi, 30, @currentDate)

end

Select * from @Dates

答案 2 :(得分:0)

您可以使用以下公式将Datetime值向下舍入到每半小时:

cast(cast(cast(MyDateTimeValue as numeric(38,18)) * 48 as int) / 48.0 as datetime)

这种方式,例如,02/03/2015 01:37 AM成为02/03/2015 01:30 AM

答案 3 :(得分:0)

要创建所需的日期范围,您可以写为:

DECLARE @s DATEtime = '20150202', @e DATEtime = '20150203';    

;WITH CTE AS
(
 SELECT  TOP ((DATEDIFF(HOUR , @s, @e)*2)+1)
 ROW_NUMBER() OVER (ORDER BY number) AS rownum,
 DATEADD(minute, (ROW_NUMBER() OVER (ORDER BY number) -1)*30, @s) AS dt
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' 
 )
 SELECT T1.dt AS StartRange,
        T2.dt AS EndRange 
 FROM CTE AS T1
 JOIN CTE AS T2 ON T1.rownum + 1 = T2.rownum