【发布时间】:2014-10-11 16:55:06
【问题描述】:
我想知道一种有效的方法来获取具有开始日期和结束日期的事件记录,并基本上在开始日期和结束日期之间的每一天复制该记录
因此,开始日期为 2014-01-01,结束日期为 2014-01-03 的记录将变为 3 条记录,每天一条
如果有帮助,我有一个日期表。我正在使用 SQL Server 2012
谢谢
【问题讨论】:
标签: sql sql-server tsql
我想知道一种有效的方法来获取具有开始日期和结束日期的事件记录,并基本上在开始日期和结束日期之间的每一天复制该记录
因此,开始日期为 2014-01-01,结束日期为 2014-01-03 的记录将变为 3 条记录,每天一条
如果有帮助,我有一个日期表。我正在使用 SQL Server 2012
谢谢
【问题讨论】:
标签: sql sql-server tsql
由于您已经有日期表,您可以将您的表与日期表一起加入,以使所有日期与您的开始和结束日期具有相同的记录
SELECT A.data,
DT.startDate,
DT.endDate
FROM
DateTable DT
JOIN A
ON A.StartDate >= DT.startDate
And A.EndDate <= DT.endDate
【讨论】:
使用这个查询
declare @startDate datetime = getdate()
declare @endDate datetime = dateadd(day,10,getdate())
;with days as
(
select
@startDate as StartDate,
@endDate as EndDate,
@startDate as CurrentDate,
0 as i
union all
select
d.StartDate,
d.EndDate,
dateadd(day,d.i + 1,@startDate) as CurrentDate,
d.i + 1 as i
from days d
where dateadd(day,d.i + 1,@startDate) < d.EndDate
)
select
*
from days d
【讨论】:
试试这个
DECLARE @dt1 Datetime='2014-01-01'
DECLARE @dt2 Datetime='2014-01-03'
;WITH ctedaterange
AS (SELECT [Dates]=@dt1
UNION ALL
SELECT [dates] + 1
FROM ctedaterange
WHERE [dates] + 1<= @dt2)
SELECT [dates]
FROM ctedaterange
OPTION (maxrecursion 0)
【讨论】:
SELECT COl1,COL2, split.a.value('.', 'VARCHAR(100)') data
FROM (SELECT COl1,COL2, Cast ('<M>'
+ Replace(LEFT(Replicate(NAME+',', datediff(dd,startdate,endate), Len(Replicate(NAME+',', datediff(dd,startdate,endate)))-1), ',''</M><M>')
+ '</M>' AS XML) AS Data
FROM tablename) AS A
CROSS apply data.nodes ('/M') AS Split(a)
【讨论】:
DECLARE @StartDate DATE = '2014-01-01',
@EndDate DATE = '2014-01-03';
SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate) + 1)
DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.number) - 1, @StartDate) AS Date_Range
FROM master..spt_values a
CROSS APPLY master..spt_values b;
Date_Range
2014-01-01
2014-01-02
2014-01-03
【讨论】: