Sql server 2008 r2 如何向SQL Server 2008 R2中的每条记录添加日期范围值
我有一个带有两个字段的tblSale SaleNo NVARCHAR50,SaleDate Datetime。 以下是tblSale中的示例数据:Sql server 2008 r2 如何向SQL Server 2008 R2中的每条记录添加日期范围值,sql-server-2008-r2,Sql Server 2008 R2,我有一个带有两个字段的tblSale SaleNo NVARCHAR50,SaleDate Datetime。 以下是tblSale中的示例数据: SaleNo SaleDate S-1000 9/26/2013 S-1001 5/26/2014 S-1002 5/26/2014 S-1003 1/26/2014 S-1004 5/27/2014 S-1005 5/21/2014 S-1006 5/27/2014 S-1007 5/27/2014 S-1008 5/27/20
SaleNo SaleDate
S-1000 9/26/2013
S-1001 5/26/2014
S-1002 5/26/2014
S-1003 1/26/2014
S-1004 5/27/2014
S-1005 5/21/2014
S-1006 5/27/2014
S-1007 5/27/2014
S-1008 5/27/2014
S-1009 5/27/2014
S-1010 5/29/2014
在SQL Server查询中,我想向每个销售数据添加日期范围,如下所示:
SaleNo SaleDate DateRange
S-1000 9/26/2013 6/1/2014
S-1001 5/26/2014 6/1/2014
S-1002 5/26/2014 6/1/2014
S-1003 1/26/2014 6/1/2014
S-1004 5/27/2014 6/1/2014
S-1005 5/21/2014 6/1/2014
S-1006 5/27/2014 6/1/2014
S-1007 5/27/2014 6/1/2014
S-1008 5/27/2014 6/1/2014
S-1009 5/27/2014 6/1/2014
S-1010 5/29/2014 6/1/2014
S-1000 9/26/2013 6/2/2014
S-1001 5/26/2014 6/2/2014
S-1002 5/26/2014 6/2/2014
S-1003 1/26/2014 6/2/2014
S-1004 5/27/2014 6/2/2014
S-1005 5/21/2014 6/2/2014
S-1006 5/27/2014 6/2/2014
S-1007 5/27/2014 6/2/2014
S-1008 5/27/2014 6/2/2014
S-1009 5/27/2014 6/2/2014
S-1010 5/29/2014 6/2/2014
S-1000 9/26/2013 6/2/2014
S-1001 5/26/2014 6/3/2014
S-1002 5/26/2014 6/3/2014
S-1003 1/26/2014 6/3/2014
S-1004 5/27/2014 6/3/2014
S-1005 5/21/2014 6/3/2014
S-1006 5/27/2014 6/3/2014
S-1007 5/27/2014 6/3/2014
S-1008 5/27/2014 6/3/2014
S-1009 5/27/2014 6/3/2014
S-1010 5/29/2014 6/3/2014
通过使用查询
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME
SET @FromDate='2014-06-01'
SET @ToDate='2014-06-03'
;with sale (SaleNo,
SaleDate,
daterange)
AS (SELECT SaleNo,
SaleDate,
@FromDate
FROM tblSale
UNION ALL
SELECT SaleNo,
SaleDate,
DATEADD(DAY, 1,@FromDate)
FROM sale
WHERE DATEADD(DAY, 1,@FromDate)<=@ToDate)
select * from sale
OPTION (MAXRECURSION 0)
问题是它的执行速度非常慢,结果不正确。
请告诉我任何想法或帮助都是非常感谢的。试试这个:
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME
SET @FromDate='2014-06-01'
SET @ToDate='2014-06-03'
DECLARE @range TABLE(dt DATETIME)
DECLARE @i INT = 0
WHILE (DATEDIFF(DAY,@FromDate,@ToDate) >= @i)
BEGIN
INSERT INTO @range VALUES(DATEADD(DAY,@i,@FromDate)
SET @i = @i + 1
END
SELECT *
FROM tblSale
CROSS JOIN @range
ORDER BY SaleDate, dt
也许是这样的: 测试数据: 查询:
有没有一种方法可以不使用交叉连接或交叉应用来实现这一点?@shree.pat18:更新了answer@Sokea:没问题。很乐意帮忙
DECLARE @tbl TABLE(SaleNo NVARCHAR(50), SaleDate Datetime)
INSERT INTO @tbl
VALUES
('S-1000','9/26/2013'),
('S-1001','5/26/2014'),
('S-1002','5/26/2014'),
('S-1003','1/26/2014'),
('S-1004','5/27/2014'),
('S-1005','5/21/2014'),
('S-1006','5/27/2014'),
('S-1007','5/27/2014'),
('S-1008','5/27/2014'),
('S-1009','5/27/2014'),
('S-1010','5/29/2014')
DECLARE @FromDate DATETIME
DECLARE @ToDate DATETIME
SET @FromDate='2014-06-01'
SET @ToDate='2014-06-03'
;WITH Nbrs ( n ) AS (
SELECT 0 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < DATEDIFF(dd,@FromDate,@ToDate))
SELECT
tbl.SaleNo,
tbl.SaleDate,
DATEADD(dd,n,@FromDate) AS DateRange
FROM
@tbl AS tbl
CROSS APPLY Nbrs
;WITH CTE
AS
(
SELECT
1 AS RowNbr,
tbl.SaleNo,
tbl.SaleDate,
@FromDate AS DateRange
FROM
@tbl AS tbl
UNION ALL
SELECT
CTE.RowNbr+1 AS RowNbr,
CTE.SaleNo,
CTE.SaleDate,
DATEADD(dd,1,CTE.DateRange) AS DateRange
FROM
CTE
WHERE CTE.RowNbr<=DATEDIFF(dd,@FromDate,@ToDate)
)
SELECT
*
FROM
CTE
ORDER BY
CTE.RowNbr