См. также ответы на вопрос , Что лучшие практики должны зарегистрировать ошибку? , особенно:
существует некоторый потенциал classloading проблемы с Входом палаты общин.
Log4J и SLF4J были разработаны тем же человеком, извлекая уроки из проблем, найденных на практике с Log4J.
Лучше всего иметь физическую таблицу дат. Их не так много даже на длительные периоды, и это будет намного быстрее, чем их материализация на лету из временных таблиц или рекурсивных ctes.
Если вы решите (или захотите) использовать специальную таблицу, а не постоянную, это сделает это:
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. Должно быть, происходит какая-то странная активность солнечных пятен. Вот ссылки:
подсчитать количество строк, которые встречаются для каждой даты в диапазоне дат столбца.
Как лучше всего создать и заполнить таблицу чисел?
что-то вроде этого:
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 ... Добавьте проверку входных параметров, чтобы убедиться, что она может работать вечно, если вы передадите дату назад