Возвратите временную таблицу непрерывных дат

См. также ответы на вопрос , Что лучшие практики должны зарегистрировать ошибку? , особенно:

  • существует некоторый потенциал classloading проблемы с Входом палаты общин.

  • Log4J и SLF4J были разработаны тем же человеком, извлекая уроки из проблем, найденных на практике с Log4J.

5
задан OMG Ponies 8 September 2009 в 18:51
поделиться

3 ответа

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

6
ответ дан 13 December 2019 в 22:12
поделиться

Если вы решите (или захотите) использовать специальную таблицу, а не постоянную, это сделает это:

CREATE FUNCTION dbo.DateList
 (
   @MinDate datetime
  ,@MaxDate datetime
 )
RETURNS TABLE
RETURN WITH
  Pass0 as (select 1 as C union all select 1), --2 rows
  Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
  Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
  Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
  Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
  Tally as (select row_number() over(order by C) as Number from Pass4)
 select dateadd(dd, Number - 1, @MinDate) DateValue
 from Tally
 where Number < datediff(dd, @MindAte, @MaxDate) + 2

GO

И тестовый звонок:

DECLARE
  @MinDate datetime
 ,@MaxDate datetime

SET @MinDate = 'Jan 1, 2009'
SET @MaxDate = 'Dec 31, 2009'

SELECT *
 from dbo.DateList(@MinDate, @MaxDate)

Wierd - это уже третий пост SO за сегодня, в котором были задействованы таблицы Tally. Должно быть, происходит какая-то странная активность солнечных пятен. Вот ссылки:

подсчитать количество строк, которые встречаются для каждой даты в диапазоне дат столбца.
Как лучше всего создать и заполнить таблицу чисел?

3
ответ дан 13 December 2019 в 22:12
поделиться

что-то вроде этого:

CREATE FUNCTION GetDates(@StartDate DateTime, @EndDate DateTime) 

RETURNS @Dates Table ( aDate DateTime Primary Key Not Null)
AS
BEGIN
 Declare @ThisDate DateTime Set @ThisDate = @StartDate  
 While @ThisDate < @EndDate begin      
      Insert @Dates (aDate) Values(@THisDate)      
      Set @ThisDate = @ThisDate + 1  
 End
RETURN 
END
GO

убедитесь, что @EndDate равен после @startdate ... Добавьте проверку входных параметров, чтобы убедиться, что она может работать вечно, если вы передадите дату назад

1
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

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