SQL Server查询以为范围内的每个日期创建新列

SQL Server查询以为范围内的每个日期创建新列,sql,sql-server,date,Sql,Sql Server,Date,我有一个程序,让用户选择一个日期范围,然后它查询SQL server数据库以检索他们工作时间的日期。我想把日期放在各自的列中,而不是放在同一列中。例如: Employee Total Hours Monday 3/10 Tuesday 3/11 .... Doe, John 40 8 8 以下是目前的问题: SELECT e.emp_fullname, t.tc_hours, t.punchDate FROM WaspTime.d

我有一个程序,让用户选择一个日期范围,然后它查询SQL server数据库以检索他们工作时间的日期。我想把日期放在各自的列中,而不是放在同一列中。例如:

Employee   Total Hours  Monday 3/10  Tuesday 3/11 ....
Doe, John    40             8             8
以下是目前的问题:

SELECT e.emp_fullname, t.tc_hours, t.punchDate 
FROM WaspTime.dbo.vEmployeeInfo as e, WaspTime.dbo.vTimeCards as t 
WHERE e.emp_id = t.tc_emp 
AND t.punchDate >= '03/10/2013'
AND t.punchDate <= '03/20/2013'

像这样的事情,无论你有多少次重复

我想你会:

  • 需要计算你的小时数吗
  • 使用某种类型的
    @period\u start\u date
    参数,每个周期都会被一天、两天、三天等所抵消
在文本编辑器中手工完成,所以请原谅打字错误,或者如果简单的东西不起作用,但我认为这个想法是清楚的/合理的

CREATE PROCEDURE GetHoursWorkedInPeriod @periodStartDate datetime = getdate() AS
SELECT 
e.emp_fullname, 
sum(t1.tc_hours) as 'Day1Hours', 
min(t1.punchDate) as 'Day1Date'.

sum(t2.tc_hours) as 'Day2Hours', 
min(t2.punchDate) as 'Day2Date',

sum(t3.tc_hours) as 'Day3Hours', 
min(t3.punchDate) as 'Day3Date',

...and so on

FROM 
WaspTime.dbo.vEmployeeInfo as e

inner join WaspTime.dbo.vTimeCards as t1
on e.emp_id = t1.tc_emp 
AND t1.punchDate >= DATEADD (day , 0 , @periodStartDate )
AND t1.punchDate < DATEADD (day , 1 , @periodStartDate )

inner join WaspTime.dbo.vTimeCards as t2
on e.emp_id = t2.tc_emp 
AND t2.punchDate >= DATEADD (day , 1 , @periodStartDate )
AND t2.punchDate < DATEADD (day , 2 , @periodStartDate )

inner join WaspTime.dbo.vTimeCards as t3
on e.emp_id = t3.tc_emp 
AND t3.punchDate >= DATEADD (day , 2 , @periodStartDate )
AND t3.punchDate < DATEADD (day , 3 , @periodStartDate )

...and so on.

GROUP BY
e.emp_fullname
创建过程GetHoursWorkedInPeriod@periodStartDate datetime=getdate()作为 挑选 e、 emp_全名, 总计(t1.tc_小时)为“第1天小时”, 最小值(t1.punchDate)为“Day1Date”。 总计(t2.tc_小时)为“第2天小时”, 最小值(t2.punchDate)为“第2天”, 总计(t3.tc_小时)为“第3天小时”, 最小值(t3.punchDate)为“第3天”, 等等 从…起 WaspTime.dbo.veemployeeinfo作为e 内部连接WaspTime.dbo.vTimeCards作为t1 在e.emp_id=t1.tc_emp上 和t1.punchDate>=DATEADD(天,0,@periodStartDate) 和t1.punchDate=DATEADD(天,1,@periodStartDate) 和t2.punchDate=DATEADD(第2天,@periodStartDate) 和t3.punchDate<日期添加(第3天,周期开始日期) 等等 分组 e、 emp_全名
编辑以将每个时段限制在OP要求的一天内,并在结果集中明确包括小时数适用的日期。

是否有日期表,还是仅基于可用的日期?源数据结构是什么?我们只是根据您现有的查询进行猜测。在“sql server pivot query”上进行谷歌搜索您也可以通过Dsql实现这一点,尽管pivot解决方案可能更好。我希望在Excel中完成最终的pivot,而不是在DB中完成,因为DB更容易完成。那么,我是否必须为我想要的每一天创建一个连接?有没有一种方法可以动态地完成它?时间跨度通常为两周,但我希望它比这更灵活一点。@Nicknack1016使用这种方法(我刚刚将其更新为SP),您只需一次性剪切/粘贴重复位并更新偏移量,例如14次(或者说31次,覆盖一个月),即可完成SP实现。然后,使用此SP的代码指定时段开始日期,然后仅动态选择它感兴趣的
“日”+日数+“小时”
“日”+日数+“日期”
列。或者最好不要在SP中使用
DayXHours
DayXDate
,使用
HoursX
DateX
,这样你就可以选择
“Hours”+dayNumber
“Date”+dayNumber
@Nicknack1016谢谢你的接受,我真的很感激。我很想知道你是否真的在使用这个解决方案?如果是的话——如果不太正确,我们非常乐意继续提供帮助(只要我们在你问题的现有范围内)。没问题=)它确实有帮助。我正在使用它,但我正在尝试调整它,以找到给定日期的一周中的某一天,即给定3/11/13的星期一,并将其作为列标题,而不是“Day1Hours”。一旦我得到了它,以及一个总小时列,一切都应该是完美的。@Nicknack1016要获得日期名称,请使用
datename(dw,t1.punchdate)
。如果需要将其作为SQL中的列标题,则需要构建一个动态SQL字符串,并将这些值作为列别名插入/连接到该字符串中。但是,如果reporting services或其他编程客户机使用此查询,那么只要将这些日期名称作为选择列表的一部分传递回去,就可以将它们用作标题。总小时数,与该期间的总小时数相同<代码>总和(t1小时)+总和(t2小时)+总和(总小时数)为总小时数。如果您希望更新答案以动态生成SQL,请告诉我。
CREATE PROCEDURE GetHoursWorkedInPeriod @periodStartDate datetime = getdate() AS
SELECT 
e.emp_fullname, 
sum(t1.tc_hours) as 'Day1Hours', 
min(t1.punchDate) as 'Day1Date'.

sum(t2.tc_hours) as 'Day2Hours', 
min(t2.punchDate) as 'Day2Date',

sum(t3.tc_hours) as 'Day3Hours', 
min(t3.punchDate) as 'Day3Date',

...and so on

FROM 
WaspTime.dbo.vEmployeeInfo as e

inner join WaspTime.dbo.vTimeCards as t1
on e.emp_id = t1.tc_emp 
AND t1.punchDate >= DATEADD (day , 0 , @periodStartDate )
AND t1.punchDate < DATEADD (day , 1 , @periodStartDate )

inner join WaspTime.dbo.vTimeCards as t2
on e.emp_id = t2.tc_emp 
AND t2.punchDate >= DATEADD (day , 1 , @periodStartDate )
AND t2.punchDate < DATEADD (day , 2 , @periodStartDate )

inner join WaspTime.dbo.vTimeCards as t3
on e.emp_id = t3.tc_emp 
AND t3.punchDate >= DATEADD (day , 2 , @periodStartDate )
AND t3.punchDate < DATEADD (day , 3 , @periodStartDate )

...and so on.

GROUP BY
e.emp_fullname