Я видел и использовал различные формы DateAdd и DateDiff для сокращения времени, перехода к первому дню любого месяца или для перемещения по дате.
Я вижу, что при выполнении этих вычислений часто используется следующий шаблон:
select DATEADD(m, DATEDIFF(m,0,GETDATE() ), 0) as 'Beginning of the month'
Я знаю, что 0 внутри выражения DateDiff равно "1 января 1900".Сначала он получает разницу дат в МЕСЯЦАХ между текущим месяцем и «1 января 1900 года».Затем добавляет число месяцев к «1 января 1900 года», и таким образом он теряет информацию о дне и по умолчанию равен 1 месяца.
Я гуглил, а также попробовал себя, используя вышеописанную технику, чтобы выяснить, каким образом я могу узнать дату, когда наступает «первая пятница апреля».Приведенный ниже фрагмент неверен, но я надеялся, что может быть что-то подобное ниже, чтобы найти финансовую неделю и год:
DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0)
Что мне в конечном итоге нужно сделать, это выяснить все номера финансовой недели (исоответствующий финансовый год) для любого заданного диапазона дат.
Первая финансовая неделя начинается с "1-я пятница апреля" .Вторая неделя начинается со следующей пятницы и т. Д.
Я понимаю, что таблица DATE будет служить и будет намного более продуктивной, но мне бы очень хотелось найти способ сделать это сейчас.
Я написал табличную функцию, которая будет производить набор данных календаря, но мне нужно добавить два приведенных ниже столбца из логики, изложенной выше, чтобы завершить ее:
- FinancialWeekNumber
- FinancialYear
Ниже приведен код, который я написал до сих пор:
create function [dbo].[MyDailyDateTable]
(@StartDate datetime, @EndDate datetime) returns @DailyDates table (
DailyDatesID int identity,
DailyDate date,
DayNumber int,
DayName varchar(50),
WeekNumber int,
QuaterNumber int,
MonthNumber int,
MonthCalled varchar(50),
YearNumber int
---- FinancialWeekNumber
---- FinancialYear ) AS BEGIN
while (@StartDate <= @EndDate)
begin
insert into @DailyDates
select @StartDate DailyDate
, datename(day, @StartDate) DayNumber
, datename(dw, @StartDate) DayName
, DATEPART(dw, @StartDate) DayOfTheWeek -- Default 1 = Monday is used ("SET DATEFIRST 1")
, datepart(week, @StartDate) WeekNumber
, DATEPART(qq , @StartDate) as QuarterValue
, datepart(month,@StartDate) MonthNumber
, datename(month,@StartDate) MonthCalled
, YEAR(@StartDate) YearNumber
---- FinancialWeekNumber
---- FinancialYear
set @StartDate = dateadd(day, 1 ,@StartDate)
end
return END