我有一张日历表:
CREATE TABLE [dbo].[FIN_CalendarTable](
[id] [int] IDENTITY(1,1) NOT NULL,
[date] [datetime] NOT NULL,
[fiscalStart] [datetime] NULL,
[fiscalEnd] [datetime] NULL,
[isHoliday] [int] NOT NULL,
[isWorkday] [int] NOT NULL
CONSTRAINT [PK_FIN_CalendarTable] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我想计算财政年度每周工作日的数量。我有以下查询返回财政周期和财政期间的每个工作日(250条记录):
SELECT dbo.CalendarTable.fiscalStart
, dbo.CalendarTable.fiscalEnd
, COUNT(*)
, dbo.CalendarTable.monthOfYearName
, dbo.CalendarTable.monthStart
, dbo.CalendarTable.monthEnd
, DATEDIFF(DAY, dbo.CalendarTable.fiscalStart, [date]) / 7 + 1 WeekOfFiscalYear
FROM dbo.CalendarTable
WHERE dbo.CalendarTable.isHoliday=0
AND dbo.CalendarTable.isWorkday=1
AND ( dbo.CalendarTable.date >= CONVERT(DATETIME,'01/07/2012',103)
AND dbo.CalendarTable.date <= CONVERT(DATETIME,'30/06/2013',103) )
GROUP BY dbo.CalendarTable.fiscalStart
, dbo.CalendarTable.fiscalEnd
, dbo.CalendarTable.monthOfYearName
, dbo.CalendarTable.monthStart
, dbo.CalendarTable.monthEnd
, [dbo].[CalendarTable].[date]
我意识到这是因为包含了[dbo]。[CalendarTable]。[date]列。是否有更好的方法来构建此查询,以便返回52(或适当的53)记录,每个会计周的总工作日数?
我可以在应用程序中实现聚合,但是如果可能的话,希望获得更好的结果。
答案 0 :(得分:0)
我宁愿尝试创建一个UDF,它会给我一些工作日或总周数,而不是尝试从查询本身获取此信息。您只有GROUP BY语句中的所有这些列,因此您可以计算记录数,并且可以使用UDF简化查询。
这是一篇文章,展示了如何计算工作日中两个日期之间的差异。 How to calculate difference between two dates in workdays
答案 1 :(得分:0)
是否有更好的方法来构造此查询以便52(或何时 适当的53)记录与总工作日一起返回 在每个财政周?
工作日的含义并不完全清楚,但如果你的意思是工作日,那么我认为你需要这些内容。
SELECT fiscalStart
, fiscalEnd
, sum(isWorkday)
FROM dbo.CalendarTable
WHERE date >= CONVERT(DATETIME,'01/07/2012',103)
AND date <= CONVERT(DATETIME,'30/06/2013',103)
GROUP BY fiscalStart
, fiscalEnd
ORDER BY fiscalStart
这假定,对于每个日期,“fiscalStart”表示会计周的第一天,“fiscalEnd”表示会计周的最后一天。如果这不是那些列的意思,请编辑您的问题,粘贴几周的INSERT语句以及预期的输出。