我需要能够选择当前日期之前60个工作日的开始日期。我有一个日历和营业日期等日历。我当前(和不成功)的方法如下:
DECLARE @Mode int
SET @Mode = 0
SET @StartDate = CASE WHEN @Mode = 0
THEN (SELECT BusDate FROM Leads.dbo.Calendar
WHERE Date = DATEADD(DAY,DATEDIFF (DAY,0,GETDATE())-60,0))
WHEN @Mode = 1
THEN DATEADD(mm,DATEDIFF (mm,0,GETDATE())-2,0)
END
此方法可以追溯到60个日历日,而不是60个工作日。我正面临着将其归结为工作日的挑战。忽略Mode = 1部分(按月计算)。 任何帮助将不胜感激。
The Calendar table has the following fields:
SELECT [Date]
,[MMDDYYYY]
,[Year]
,[QTR]
,[Month]
,[Week]
,[YTDDay]
,[QTDDay]
,[MTDDay]
,[WeekDayNbr]
,[Quarter]
,[MonthLName]
,[MonthName]
,[DayOfWeekS]
,[DayOfWeek]
,[KindOfDay]
,[Description]
,[Period]
,[YrMo]
,[YrWk]
,[StartDate]
,[EndDate]
,[BusPeriod]
,[Holiday]
,[NonBus]
,[BusDaysInMonth]
,[BusDay]
,[BusDaysRemain]
,[BusDate]
,[YYYYMMDD]
BusDay是一个月的营业日(1,2,3等)。目前没有列表示1表示是,0表示否表示它是工作日,尽管我可以添加。 NonBus和Holiday字段以这样的方式运行:1是假日或非工作日(假日和周末),0不是。
答案 0 :(得分:2)
我们对您的日历表了解不多,但您可以做这样的事情。使用仅包含工作日的派生表,该工作日小于今天的日期,并为每个工作日提供按日期desc排序的行号。然后从第60行选择日期。
select busdate
from
(
select *,
row_number() over (order by date desc) as dayNo
from leads.dbo.calendar
where nonBus = 0 -- Only business days
and date < cast(getdate() as date)
) busDays
where dayno = 60