mou*_*use 14 t-sql sql-server datetime sql-server-2008
我正在尝试生成一个包含一系列日期时间的表.
我有指定的开始日期时间和结束日期时间(结束日期时间是序列结束),我添加一个时间间隔〜(这可能会有所不同)到开始日期时间(以秒为单位),这给了我结束日期时间.
下一个序列使用结束日期时间作为其起始值,并以秒为单位添加时间间隔.为了证明我需要的输出.有没有一种快速的方法来创建这样的表,除了使用大量插入命令?,我真的很难过
StartTime Endtime Duration
2011-07-20 11:00:33 2011-07-20 11:09:47 554
2011-07-20 11:09:47 2011-07-20 11:19:01 554
declare @StartTime datetime = '2011-07-20 11:00:33',
@EndTime datetime = '2011-07-20 15:37:34'
@Interval int = 554 -- this can be changed.
insert into tmp_IRange
values('2011-07-20 11:00:33', DATEADD(SECONDS, @Duration, 2011-07-20 11:00:33))
Run Code Online (Sandbox Code Playgroud)
这变得非常繁琐..尤其是当结束日期时间2011-07-20 15:37:34
有很多插入语句时:(
gbn*_*gbn 19
使用递归CTE
declare @StartTime datetime = '2011-07-20 11:00:33',
@EndTime datetime = '2011-07-20 15:37:34',
@Interval int = 554 -- this can be changed.
;WITH cSequence AS
(
SELECT
@StartTime AS StartRange,
DATEADD(SECOND, @Interval, @StartTime) AS EndRange
UNION ALL
SELECT
EndRange,
DATEADD(SECOND, @Interval, EndRange)
FROM cSequence
WHERE DATEADD(SECOND, @Interval, EndRange) < @EndTime
)
/* insert into tmp_IRange */
SELECT * FROM cSequence OPTION (MAXRECURSION 0);
Run Code Online (Sandbox Code Playgroud)
这个将给出单独的范围,但会忽略您的实际结束时间(因为它在最后一个有效范围之后是<@interval):
;WITH x AS
(
SELECT TOP (DATEDIFF(SECOND, @StartTime, @EndTime)/@Interval)
rn = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.objects
)
-- INSERT INTO dbo.tmp_IRange
SELECT DATEADD(SECOND, @Interval * (rn-1), @StartTime),
DATEADD(SECOND, @Interval * rn, @StartTime)
FROM x;
Run Code Online (Sandbox Code Playgroud)
这应该可以帮助您开始。您可以根据您的具体需求进行调整。正如所写的,它将为从当前日期和时间开始的每分钟增量生成一行。
DECLARE @BaseDate DateTime = GETDATE();
WITH DateTable (DateValue) AS (
SELECT @BaseDate DateValue
UNION ALL
SELECT DATEADD(Minute, 1, DateValue) DateValue
FROM DateTable
)
SELECT *
FROM DateTable
WHERE DateValue < DATEADD(Day, 1, GETDATE())
OPTION (MAXRECURSION 0);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12865 次 |
最近记录: |