簡體   English   中英

如何獲得每天最早日期時間的平均值?

[英]How to get average of earliest datetime per day?

我需要根據他們每天最早的入住時間來計算平均時間。

例如,這些是我簽入的日期時間。

Person | Checkin
-----------------
Jack    2022-01-06 16:42:34.000
Jack    2022-01-06 17:30:34.000
Jack    2022-01-07 10:22:34.000
Jack    2022-01-07 12:12:54.000
Jack    2022-01-08 11:08:53.000

當我想根據最早的入住時間計算我的平均入住時間時,我應該只考慮這些日期時間。

2022-01-06 16:42:34.000
2022-01-07 10:22:34.000
2022-01-08 11:08:53.000

這是我當前的 sql 以獲得平均檢查時間。 但這會考慮上面的所有日期時間並獲得平均時間。

Select Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime' from #Tab_CheckIn
group by Person

我怎樣才能只考慮每天最早的日期時間並獲得平均時間?

這有點亂。

首先,您需要對數據進行分組,以便最早簽到我的一天。 這很簡單,使用CONVERTdateMIN

然后你需要得到那些時間的“平均值”。 但是,您無法在 SQL 服務器中平均time ,因為time表示一天中的時間點而不是時間間隔,因此將它們平均為時間跨度是沒有意義的。 因此,您需要將值“轉換”為數值。

在這種情況下,我使用DATEDIFF來獲取從午夜到簽入轉換為time的秒數。 然后我可以平均這些值,最后將它們加到午夜:

WITH Earliest AS(
    SELECT Person,
           MIN(Checkin) AS EarliestCheckin
    FROM dbo.YourTable
    GROUP BY Person,
             CONVERT(date,Checkin))
SELECT Person,
       DATEADD(SECOND,AVG(DATEDIFF(SECOND,'00:00',CONVERT(time,EarliestCheckin))),CONVERT(time,'00:00')) AS AverageCheckin
FROM Earliest
GROUP BY Person;

假設你得到想要的結果(除了過濾不想要的日期)

Select t.Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(t.Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime'
from (SELECT Person, min(Checkin) as Checkin FROM #Tab_CheckIn
      GROUP BY Person, cast(Checkin As Date)) t
group by t.Person
SELECT Person,(CAST(DATEADD(SS, AVG(CAST(DATEDIFF(SS, '00:00:00', CAST(Checkin AS TIME)) AS BIGINT)), '00:00:00' ) AS TIME)) AS 'AvgCheckInTime'
from (
SELECT person, checkin, row_number() over(PARTITION by person, CAST(checkin as DATE) order by checkin asc) as row 
FROM #Tab_CheckIn) as p
where p.row =1
group by p.person

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM