不知道為什麼,老大說不要在SQL 裡面加CASE 條件上和運算式,但我在統計表裡面,用了很多條件判斷,還用到了很多運算,老大說,重做。我不明白為什麼。老大說是標准,不能改。暈倒
給個例子,大家看怎麼做
比如說,要統計一年的按(部門,月份)的刷卡時數,一天包括(上班刷卡,下班刷卡),當然只在上班日才要刷卡了,中間休息不用刷卡,在數據庫有的資料是'24:00'這樣的時間格式,所以你必要把24:00轉換成第二天00:00,注意這裡只有時間,沒有日期的字符格式,還存在誇日的情況,要統計的刷卡時數包含了休息時間,所以要減掉。數據表裡的資料是每個人每天的刷卡資料。
按老大的意思,大家看要怎麼做
給個例子,大家看怎麼做
比如說,要統計一年的按(部門,月份)的刷卡時數,一天包括(上班刷卡,下班刷卡),當然只在上班日才要刷卡了,中間休息不用刷卡,在數據庫有的資料是'24:00'這樣的時間格式,所以你必要把24:00轉換成第二天00:00,注意這裡只有時間,沒有日期的字符格式,還存在誇日的情況,要統計的刷卡時數包含了休息時間,所以要減掉。數據表裡的資料是每個人每天的刷卡資料。
按老大的意思,大家看要怎麼做
check06=' case when day_id_check06=''Y'' then datediff(Minute,(case when day_id_check07=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check07 end),'
+'(case when day_id_check08=''24:00'' then dateadd(Minute,1,''23:59'') else (case when day_id_check07>day_id_check08 then dateadd(day,1,day_id_check08) else day_id_check08 end) end)) else 0 end ';
//得出午休時間(分鐘)
check11=' case when day_id_check11=''Y'' then dateDiff(Minute,(case when day_id_check12=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check12 end),'
+'(case when day_id_check13=''24:00'' then dateadd(Minute,1,''23:59'') else '
+' (case when day_id_check12>day_id_check13 then dateadd(day,1,day_id_check13) else day_id_check13 end) end)) else 0 end ';
//得出晚休時間(分鐘)
check14=' case when day_id_check14=''Y'' then dateDiff(Minute,(case when day_id_check15=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check15 end),'
+'(case when day_id_check16=''24:00'' then dateadd(Minute,1,''23:59'') else '
+' (case when day_id_check15>day_id_check16 then dateadd(day,1,day_id_check16) else day_id_check16 end) end)) else 0 end ';
//確認上班時間 包括了休息時間 (分鐘)
check19=' DateDiff(Minute,day_id_check20,day_id_check21) ' ;
//判斷有沒有算午休時間, 針對實上班時數
yes_check11 = ' (case when day_id_check11=''Y'' then '
+ '(case when day_id_check20 < '
+ '(case when day_id_check12<day_id_check07 then '
+ ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check12)'
+ ' else convert(char(10),day_id_check02)+'' ''+ day_id_check12 end )'
+ ' and day_id_check21 > '
+ '(case when day_id_check13<day_id_check07 then '
+ ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check13)'
+ ' else convert(char(10),day_id_check02)+'' ''+day_id_check13 end )'
+ ' then 1 else 0 end)'
+ ' else 0 end)';
//判斷有沒有算晚休時間, 針對實上班時數
yes_check14 = ' (case when day_id_check14=''Y'' then '
+ '(case when day_id_check20 < '
+ '(case when day_id_check15<day_id_check07 then '
+ ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check15)'
+ ' else convert(char(10),day_id_check02)+'' ''+ day_id_check15 end )'
+ ' and day_id_check21 > '
+ '(case when day_id_check16<day_id_check07 then '
+ ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check16)'
+ ' else convert(char(10),day_id_check02)+'' ''+day_id_check16 end )'
+ ' then 1 else 0 end)'
+ ' else 0 end)';
//實上班時數 =確認刷卡時數 - 午休時間 - 晚休時間 因為精確到0.5
SSB ='( '+check19+'-(case when '+yes_check11+'=1 then '+ check11+' else 0 end) - (case when '+yes_check14+'=1 then '+check14+' else 0 end)'+')/60+ '
+ '(case when ( '+check19+'- (case when '+yes_check11+'=1 then '+ check11+' else 0 end) - (case when '+yes_check14+'=1 then '+check14+' else 0 end))'
+ '%60>=30 then 0.5 else 0 end)';
如果有部门。月份。时间这三个字段
那么你用分类汇总就得到想要的。
select 部门,月份 count(*) as 次数 from 表 group 部门,月份
我觉得还是DECODE函数比较好用
而且可以使SQL语句简洁
你老大的话也可能是他的经验之谈
毕竟他的经验要多一些.
2、通过CASE实际上是至少多了一次运算,这当数据量大的时候是很恐怖的3、其实你的问题本来很简单
A. 根本就没有24:00这个东西,23:59:59后的一秒是0:00:00,所以在做考勤原始记录的时候就应该把这个时间删除,这个时间一般是考勤机特殊的标记
B. 你应该加入日期字段,或者用日期时间字段代替你的这个字段,这个是基本的东西,因为一个人一天的考勤可能会跨3天,尤其是当加班的时候
同意Hank(星星农场)
1 為服務減擔
2 為以後好維護