Sql server 2008 r2 如何向SQL Server 2008 R2中的每条记录添加日期范围值

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

我有一个带有两个字段的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/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