Как получить таблицу дат между X и Y в SQL-сервере 2005

Без lookahead, чистое выражение:

http://regexr.com/3ddva

В принципе, просто проверяет каждый случай.

10
задан Chris 26 September 2008 в 20:00
поделиться

7 ответов

Строго говоря это точно не отвечает на Ваш вопрос, но его крутое.

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

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 )
18
ответ дан 3 December 2019 в 23:15
поделиться

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

select  ...
from    Calendar
        left outer join
        ...
where   Calendar.Date >= @x
and     Calendar.Date <= @y
1
ответ дан 3 December 2019 в 23:15
поделиться

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

0
ответ дан 3 December 2019 в 23:15
поделиться

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

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

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

0
ответ дан 3 December 2019 в 23:15
поделиться

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

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
ответ дан 3 December 2019 в 23:15
поделиться

Просто запишите цикл. Кто-то должен записать цикл для этого, быть им Вы - или 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
-1
ответ дан 3 December 2019 в 23:15
поделиться

Просто: ГДЕ седло> дата начала И седло <дата окончания

-4
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: