SQL Query显示两个日期之间的出席情况

时间:2013-12-17 12:29:56

标签: sql .net sql-server

我有一个.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 ...希望这更有意义并感谢您的帮助

2 个答案:

答案 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)。