Я видел и использовал различные формы 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
- Финансовый год
Ниже приведен код, который я написал до сих пор:
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