Pages - Menu

2016年4月25日 星期一

SQLserver日期加總

看到有人問個很好玩的問題,
userA  3min30sec
userB 8min20sec
userC 30sec
算總和


declare @t table
(sn int primary key,name varchar(10),totalTime varchar(80))
insert into @t values (1,'Liu','8min20sec'),(2,'Chiu','32min8sec'),(3,'Wang','21sec')
select convert(varchar,dateadd(s,sum(datepart(mi,'1900/01/01 00:' + replace(
case when charindex('min',totalTime)>0 then REPLACE(totalTime,'min',':') else '0:'+totalTime end,'sec',''))*60+
datepart(s,'1900/01/01 00:' + replace(
case when charindex('min',totalTime)>0 then REPLACE(totalTime,'min',':') else '0:'+totalTime end,'sec',''))),0),108)
from @t
一步一步拆解:
首先將 32min8sec拆成正常的 分:秒,使用replace來取代。
replace(REPLACE(totalTime,'min',':'),'sec','')
但由於資料內有些是沒有sec,故加上case when條件,如果沒有min的話,則將分設為0
case when charindex('min',totalTime)>0 then REPLACE(totalTime,'min',':') else '0:'+totalTime end,'sec',''))
再來,由於只有分跟秒,不算是一個完整的datetime,故加上1900/01/01 0: 讓他變成一個時間格式。然後使用 datepart 的函數,取裡面日期的分、秒。
datepart(mi,'1900/01/01 00:' + replace(
case when charindex('min',totalTime)>0 then REPLACE(totalTime,'min',':') else '0:'+totalTime end,'sec',''))
最後最簡單的就是sum 相加拉。
但目前都是秒數,如果要變成容易觀看的時間,先將他變成日期格式,才能再轉成時:分:秒
因此,dateadd(s,xxx,0)  讓欄位加0秒,轉成時間,
再使用convert(varchar,XXX,108),就是我們看到的 時:分:秒 了~~

沒有留言:

張貼留言