如何在日期范围内的每个日期重复使用3个名称?

时间:2015-12-23 21:04:02

标签: sql sql-server

这是我在这里的第一个问题,所以如果我做错了,我会道歉。我也是一个SQL爱好者,如果我没有任何意义,那就很抱歉。我正在使用SQL Server 2014。

我的日期范围是日期(2015年1月11日至11月30日),我有3个地点名称:NY,LA,SF。我是否可以将每个名称显示在范围内的每个日期的单独行中?

这样的事情:

11/01/15 |纽约
11/01/15 | LA
11/01/15 | SF
11/02/15 |纽约
11/02/15 | LA
11/02/15 | SF
11/03/15 |纽约
11/03/15 | LA
11/03/15 | SF




11/30/15 |纽约
11/30/15 | LA
11/30/15 | SF

3 个答案:

答案 0 :(得分:1)

看到你的CTE:

WITH mycte
     AS
        (
     SELECT CAST('20151101' AS DATETIME
                ) DateValue
     UNION ALL
     SELECT DateValue + 1
     FROM mycte
     WHERE DateValue + 1 < '20151201'
        ),
     myNames
            (myName
            )
     AS
        (
     SELECT 'NY'
     UNION
     SELECT 'LA'
     UNION
     SELECT 'SF'
        )
     SELECT *
     FROM mycte m
          CROSS JOIN myNames mn;

答案 1 :(得分:0)

假设日期位于名为myDates的表中,名称位于名为myNames的表中,字段名分别为myDate和myName:

select d.myDate, n.myName
from myDates d
cross join myNames n
where d.MyDate >= '20151101' and d.myDate < '20151201'

答案 2 :(得分:0)

试试这个:

DECLARE @StartDate DATE = '20150111'
DECLARE @EndDate DATE = '20151130'
DECLARE @Diff INT = DATEDIFF(DAY, @StartDate, @EndDate)
PRINT @Diff

;WITH DateRangeCte AS (
    SELECT DATEADD(DAY, currDay - 1, @StartDate) AS RangeDate
    FROM ( 
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS currDay
        -- this table should have more records than range size
        FROM sys.messages                               
    ) nbrs
    WHERE currDay - 1 <= @Diff
)
SELECT RangeDate, LocationName
FROM DateRangeCte C 
    CROSS JOIN (
        SELECT 'NY' AS LocationName UNION ALL 
        SELECT 'LA' UNION ALL
        SELECT 'SF'
    ) Loc
go

根据建议,DateRangeCte可以使用recursive CTE生成,也可以通过迭代“足够大”的表生成(已知行数大于间隔大小)。我选择了sys.message,因为它非常大(超过200K),但它会对性能产生影响。如果性能很重要,请选择递归CTE(st33vemcqu33n's回答)。

另外,我有一个“匿名”表格CROSS JOINED。我猜这些状态将存储在持久表中,因此您将与该表交叉连接。