簡體   English   中英

SQL選擇每天的最早開始日期時間和最晚結束日期時間

[英]SQL Select earliest start DateTime and Latest end DateTime of each day

我有一個下表,用於跟蹤員工的每日入職情況。 員工一天可以有多個簽入和簽出。 有沒有一種顯示方式,使得每個記錄都有EmployeeID以及每天的最早的CheckIn和最晚的CheckOut來匯總記錄。

CREATE TABLE IF NOT EXISTS `PhyMeS_schema`.`DailyEntry` (
  `EmployeeID` VARCHAR(10) NOT NULL,
  `CheckIn` DATETIME NOT NULL,
  `CheckOut` DATETIME NULL,
  PRIMARY KEY (`EmployeeID`, `CheckIn`),
  CONSTRAINT `fk_dailyEntry_EmployeeID`
    FOREIGN KEY (`EmployeeID`)
    REFERENCES `PhyMeS_schema`.`Employee` (`EmployeeID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

您應該能夠對EmployeeIDDATE(CheckIn)使用簡單的GROUP BY來做到這一點,如下所示:

SELECT
    EmployeeID
,   DATE(CheckIn) AS the_date
,   MIN(CheckIn) AS min_checkin
,   MAX(CheckOut) AS max_checkout
FROM DailyEntry
GROUP BY EmployeeID, DATE(CheckIn)

注意:此查詢假定所有簽出均與相應的簽入在同一天進行。 換句話說,午夜沒人在里面。 如果您需要處理夜班,查詢將變得更加復雜:

SELECT EmployeeID, the_date, MIN(min_checkin), MAX(max_checkout)
FROM (
    SELECT EmployeeID, DATE(CheckIn) AS the_date, MIN(CheckIn) AS min_checkin, null as max_checkout
    FROM DailyEntry
    GROUP BY EmployeeID, DATE(CheckIn)
UNION ALL
    SELECT EmployeeID, DATE(CheckOut) AS the_date, null AS min_checkin, MAX(CheckOut) as max_checkout
    FROM DailyEntry
    GROUP BY EmployeeID, DATE(CheckOut)
) GROUP BY EmployeeID, the_date

暫無
暫無

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

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