MSSQL中如何取A表中一天中時間最早、最晚的記錄更新到B表,通過ID號關聯

把A表中的時間取一天中最大、最小的時間更新到B表中,要求A表和B表中的ID和 date要關聯.
說明:A表的id和B表的id可能存在不完全相符,A表中每個id的同一天的時間記錄可能存在多條記錄
B表的每個id一個月的每天都有一條記錄(比如每個id在9月有30天記錄),datea的時間要求<'8:30:00' dateb的時間要求>'18:30:00'

供參考的SQL如下: 
update B
set B.datea = isnull(s.minDate, B.datea), B.dateb = isnull(s.maxDate, B.dateb)
from (
    -- 按id, dateValue(即日期值e799bee5baa6e58685e5aeb931333335333733) 取得最大值,最小值
    select s0.id, s0.dateValue, max(s0.date) as maxDate, min(s0.date) as minDate
    from (
        -- 將A.date的值轉成不帶時分秒的日期值dateValue,並計算出當日的秒數值valSeconds 
        select A.id, A.date, convert(datetime, convert(nvarchar(30), A.date, 101), 101) as dateValue, datepart(hh, A.date) * 3600 + datepart(mi, A.date) * 60 + datepart(ss, a.date) as valSeconds
        from A 
     ) s0
    -- 將數據值限制在8:30以前, 18:30之後, 用秒數值比較的結果,精確到秒數  
    where (s0.valSeconds < 8 * 3600 + 30 * 60 or s0.valSeconds > 18 * 3600 + 30 * 60) 
    group by s0.id, s0.dateValue     
) s
where B.ID = s.id and B.date = s.date

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章