從開始和結束日期算起,一個人如何計算完整天數和半天

Background

我一直在研究一些報告視圖,這些視圖需要multi-day個工作班次,并且應該根據數據進行一些計算,但我有點被困在這里。一次典型的輪班是3個日歷日,通常是1half-day和兩個完整的工作日,或者是一周2half-days(結束和開始)和5個完整的工作日。

Specifications

我對一整天和half-day有以下規定。這些規則是以監管為基礎的,不能更改。

  • 2 half-days != 1full-day,兩半更“有價值”
  • 給定started_atiso datetime和end_atiso datetime
  • 我想得到兩個數字,full_days和half_days
  • 半天是指從12點或之后開始的范圍開始的一天,以及在19點之前結束的范圍結束的一天
  • 全天是指范圍內的一天(傳統的24小時),范圍開始時為12點之前,范圍結束時為19點或19點之后

我認為,在視圖中,最好是每full-day和half-day一行,或者將half_days和full_days作為兩個獨立列的聚合行,將其與其他視圖連接起來。

Simplified model

我簡化了數據模型,省去了不必要的列。

create table if not exists [trip]
(
    trip_id    integer
        constraint trip_pk
            primary key,
    started_at text default (datetime('now')),
    end_at     text default (datetime('now'))
);

我有點糾結于該如何設計這個查詢。一個簡單的時間差是行不通的。

SQLFiddle處理樣本數據和答案:http://sqlfiddle.com/#!5/de7551/2

? 最佳回答:

您可以通過計算日跨度(輪班跨度天數)的CTE來解決這個問題。由于半天總是1, 2或0(只發生在結束和開始),我們實際上不需要每天單獨考慮。

您可以使用julianday以數字形式獲取日期,但是julian日期從中午開始,因此您需要減去0.5以獲得用于計算的“實際”日期。如果結束時間晚于每一天的開始時間,則確定結束日,以避免較長的跨度,并將結果匯總,將部分天數作為跨度日。

此時,我們可以通過檢查結束和開始來計算半天的天數。為了得到完整天數,我們只需從結果中減去半天。

with trip_spans as (
select
    ceil(julianday(end_at)-0.5 - floor(julianday(started_at)-0.5)) day_span
    , t.*
    , (
        iif(time(started_at) > time('12:00'), 1, 0)
        +
        iif(time(end_at) <= time('19:00'), 1, 0)
     ) half_days
    from trip t
)
select
    trip_spans.*
    , day_span-half_days full_days
from trip_spans
主站蜘蛛池模板: 无码AⅤ精品一区二区三区| 日韩AV无码一区二区三区不卡毛片| 99无码人妻一区二区三区免费| 天堂Aⅴ无码一区二区三区| 日韩社区一区二区三区| 北岛玲在线一区二区| 日韩精品一区二区午夜成人版 | 亚洲视频在线一区| 国产吧一区在线视频| 精品欧美一区二区在线观看 | 天堂va在线高清一区| 日本免费一区尤物| 人妻少妇AV无码一区二区 | 亚洲Av无码国产一区二区| 天美传媒一区二区三区| 亚洲午夜精品第一区二区8050| 日本在线一区二区| 国产精品一区二区无线| 国产一区二区三区在线2021| 亚洲中文字幕久久久一区| 一区视频在线播放| 亚洲一区二区电影| 国产精品一区不卡| 无码国产精品一区二区免费3p| 亚洲国产AV一区二区三区四区| 久久国产精品免费一区二区三区| 亚洲一区二区三区精品视频 | 国产视频一区二区在线播放| 亚洲色无码专区一区| 国产午夜精品一区二区三区漫画 | 国产精品无码一区二区在线观| 亚洲AV无码一区二三区| 极品尤物一区二区三区| 黄桃AV无码免费一区二区三区| 2021国产精品视频一区| 国产在线aaa片一区二区99| 国内精品一区二区三区在线观看| 日本不卡在线一区二区三区视频| 天堂一区二区三区精品| 久久精品黄AA片一区二区三区| 一区二区三区在线|