我有一个.Net应用程序,其中包含一个考勤表,其中包含开始日期和结束日期的字段。我很难显示给定时期的出勤率图表。我可以很容易地找到在任何给定日期间使用多少行,但我无法理解旋转结果,以便我可以绘制每天的行数。我可以每天单独运行一个SQL查询然后绘制结果图,但有没有办法用T-SQL做这个,然后我可以用它来图表?
编辑: -
道歉,因为这是我第一次在这里提出问题,但正如huMpty duMpty所说,这个问题可能需要更多澄清。我在sql db中有一个startdate和enddate列,如果这些日期之间的范围介于选择标准的范围之内,我需要每天计数。例如,如果我的开始日期为2013-01-01,结束日期为2013-01-10,并且我报告2013-01-09至2013-01-11期间,那么我正在寻找结果对于2013-01-09的1和2013-01-10的1 ...希望这更有意义并感谢您的帮助
答案 0 :(得分:0)
你说你希望在日期范围内按天计算。这可以通过带有GROUP BY子句的COUNT
来完成。
我不知道您的架构,但解决方案可能如下所示:
declare @MyTable table
(
ID int identity(1,1) primary key clustered,
MyDate smalldatetime
)
insert into @MyTable (MyDate)
values
('2012-12-31'), -- before the date range, so not included in results
('2013-01-10'),
('2013-01-10'), -- appears twice
('2013-01-11'), -- appears once
('2013-01-12') -- after the date range, so not included in results
select * from @MyTable
select
MyDate,
count(*)
from @MyTable
where MyDate between '2013-01-09' and '2013-01-11'
group by MyDate
答案 1 :(得分:0)
我认为你有一个包含开始和结束日期的表格;对于给定的日期范围,您希望知道每个日期的给定记录数。
我相信这个问题可以用数字表来解决。我在存储过程中动态创建了一个数字表,但我建议在生产代码中创建一个永久数字表。这是SQL Fiddle。
Create Table Attendance (
id int primary key identity(1,1) not null
,start_date date not null
,end_date date not null
);
Go
Insert Attendance(start_date, end_date)
Values ('1/1/2013', '1/10/2013')
,('1/10/2013', '1/15/2013')
,('2/20/2013', '3/1/2013');
Go
-- Create numbers table. See: Method 3 of http://stackoverflow.com/a/1407488/772086
With Numbers(Number) As
(
Select 1 As Number
Union All
Select Number + 1 From Numbers Where Number < 10000
)
Select
AttendanceDate = Convert(date, DateAdd(day,Numbers.number, '1/1/2000'))
,AttendanceCount = Count(*)
From dbo.Attendance
Join Numbers
On Numbers.Number
Between DateDiff(day, '1/1/2000', Attendance.start_date)
And DateDiff(day, '1/1/2000', Attendance.end_date)
-- Reporting range between 1/9 and 1/11
Where DateAdd(day,Numbers.number, '1/1/2000') Between '1/9/2013'
And '1/11/2013'
Group By Convert(date, DateAdd(day,Numbers.number, '1/1/2000'))
Option(MaxRecursion 10000);
所有日期均为美国格式(月/日/年) - 您可能希望在生产代码中将这些日期切换为国际化标准(yyyy-mm-dd)。