Как получить таблицу дат между х и у в SQL Server 2005 - PullRequest
10 голосов
/ 18 сентября 2008

Мне просто нужен быстрый способ (и желательно не использовать цикл while) создания таблицы с каждой датой между датой @x и датой @y, чтобы я мог оставить внешнее соединение с некоторыми таблицами статистики, некоторые из которых не записи за определенные промежуточные дни, что позволяет мне отмечать пропущенные дни 0

Ответы [ 9 ]

18 голосов
/ 18 сентября 2008

Строго говоря, это не совсем отвечает на ваш вопрос, но довольно аккуратно.

Предполагая, что вы можете жить с указанием количества дней после даты начала, а затем с помощью выражения общего стола вы получите:

WITH numbers ( n ) AS (
        SELECT 1 UNION ALL
        SELECT 1 + n FROM numbers WHERE n < 500 )
    SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
    OPTION ( MAXRECURSION 500 )
3 голосов
/ 18 сентября 2008

Я считаю, что вы ищете это сообщение в блоге .

1 голос
/ 18 сентября 2008

Я бы создал таблицу календаря, которая бы содержала каждую дату от подходящей даты начала до подходящей даты окончания. Это не заняло бы много места в вашей базе данных и сделало бы эти типы запросов детскими играми.

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y
0 голосов
/ 15 марта 2016

Небольшой поворот в ответе, заданном как https://stackoverflow.com/a/95728/395440. Позволяет указать дни, а также рассчитывает диапазон до текущей даты.

DECLARE @startDate datetime
SET @startDate = '2015/5/29';

WITH number ( n ) AS (
        SELECT 1 UNION ALL
        SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()) )
    SELECT DATEADD(day,n-1,@startDate) FROM number where
    datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
    OPTION ( MAXRECURSION 500 )
0 голосов
/ 18 сентября 2008

Просто напишите цикл. Кто-то должен написать цикл для этого, будь то вы или SQL Server.

DECLARE @Dates TABLE
(
  TheDate datetime PRIMARY KEY
)
DECLARE @StartDate datetime, @EndDate datetime
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01'


DECLARE @LoopVar int, @LoopEnd int    
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0


WHILE @LoopVar <= @LoopEnd
BEGIN
  INSERT INTO @Dates (TheDate)
  SELECT DateAdd(dd,@LoopVar,@StartDate)

  SET @LoopVar = @LoopVar + 1
END


SELECT *
FROM @Dates
0 голосов
/ 18 сентября 2008

Я нашел другую таблицу, в которой хранится каждая дата (это посетители сайта), так как насчет этого ...

Declare @FromDate datetime,  
        @ToDate datetime  
Declare @tmpDates table   
            (StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()

Insert Into  @tmpDates (StatsDate)
Select 
    distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats 
Where visitDate between @FromDate And @ToDate 
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME) 


Select * FROM @tmpDates

Он полагается, что в другой таблице есть запись для каждой даты, которую я хочу, но с 98% вероятностью будут данные за каждый день.

0 голосов
/ 18 сентября 2008

Некоторое время назад я делал нечто подобное, но я не мог придумать способ, который бы не использовал цикл.

Лучшее, что я получил, это временная таблица, а затем выбрал даты, к которым я хотел присоединиться.

Блог, на который ссылается bduke, симпатичен, хотя я думаю, что решение для временного стола, возможно, является более чистым решением.

0 голосов
/ 18 сентября 2008

Я думаю, что вы могли бы просто сделать это в цикле. Я знаю, что это некрасиво, но это легко и работает.

0 голосов
/ 18 сентября 2008

Just: WHERE col> дата начала И col <дата окончания </p>

...