转换数据库中某些字段的类型(CAST)
数据库中设计了一个人员状态表,如下表所示:
帐号 | 工作状态 | 年 | 月 | 日 |
1 | 工作 | 2012 | 3 | 28 |
1 | 工作 | 2012 | 3 | 29 |
2 | 休息 | 2012 | 3 | 28 |
2 | 休息 | 2012 | 3 | 29 |
我现在想要做的是,统计每个帐号在一段时间内的工作天数,以及详细显示该帐号的工作时间(具体要得到的内容如下面两张表)
帐号 | 姓名 | 工作 | 休息 |
1 | 张三 | 2 | 0 |
2 | 李四 | 0 | 2 |
帐号 | 姓名 | 工作日期 |
1 | 张三 | 2012/3/28 |
1 | 张三 | 2012/3/29 |
怎样通过上面一张表得到下面的两张表呢?
根据这个语句我们可以组合成查询语句中的where条件语句:CAST( (CAST(Year as nvarchar) + '-' + CAST(Months as nvarchar) + '-' + CAST(Days as nvarchar) + ' 00:00') AS DateTime)
where CAST( (CAST(Year as nvarchar) + '-' + CAST(Months as nvarchar) + '-' + CAST(Days as nvarchar) + ' 00:00') AS DateTime) >= '2012/3/28'
and CAST( (CAST(Year as nvarchar) + '-' + CAST(Months as nvarchar) + '-' + CAST(Days as nvarchar) + ' 00:00') AS DateTime) <= '2012/3/29'
统计状态天数的语句: count((case state when 工作 then 1 end)) as 工作
只要将这两句话灵活的组合在一起,就可以完成上面三个表格之间的转换:另外还有一句:
ISNULL((select b.State from TKY_EmployeeState b where b.EmployeeCode=s.EmployeeCode AND b.Year=DATEPART(YEAR, '2012/3/29')
and b.Months=DATEPART(MONTH, '2012/3/29') and b.Days=DATEPART(DAY, '2012/3/29'),'') AS a