mysql select 对行进行分组和 datdiff
mysql select grouping by and datdiff on the rows
鉴于此数据:
workercode | timestamp | action |
01 | 19/07/20 09:00:00 | _in |
01 | 19/07/20 16:00:00 | _out |
01 | 20/07/20 09:00:00 | _in |
01 | 20/07/20 13:00:00 | _out |
02 | 16/07/20 09:00:00 | _in |
02 | 16/07/20 15:00:00 | _out |
我需要得到每个用户,他那天待了多少小时。类似于:
01 | 19/07/20 | 7 |
01 | 20/07/20 | 4 |
02 | 16/07/20 | 6 |
我正在尝试按 workercode
和 cast(timestamp, date)
分组,并在 select 上尝试类似 datediff 之类的方法,但我做不到。
有没有简单的方法来做到这一点?
提前致谢。
试试这个:
用于 MsSql。
// For MS SQL.
CREATE TABLE TEST(workercode int, timestamp DATETIME2, action NVARCHAR(10))
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '19/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '19/07/20 16:00:00', '_out')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '20/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '20/07/20 13:00:00', '_out')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (2, '16/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (2, '16/07/20 15:00:00', '_out')
SELECT temp.workercode, temp.date, DATEDIFF(HOUR, MIN(temp.timestamp), MAX(temp.timestamp))
FROM (SELECT DATEFROMPARTS(Year(t.timestamp), Month(t.timestamp), Day(t.timestamp)) as date, t.workercode, t.timestamp, t.action FROM dbo.TEST as t) as temp
GROUP BY temp.date, temp.workercode
这是为了 MySql。
//For MySQL
CREATE TABLE TEST(workercode int, timestamp1 TIMESTAMP, action VARCHAR(10));
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "19/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "19/07/20 16:00:00", "_out");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "20/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "20/07/20 13:00:00", "_out");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (2, "16/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (2, "16/07/20 15:00:00", "_out");
SELECT temp.workercode, temp.date, TIMEDIFF(MAX(temp.timestamp1), MIN(temp.timestamp1))
FROM (SELECT DATE(CONCAT_WS('-',Year(t.timestamp1), Month(t.timestamp1), Day(t.timestamp1))) as date, t.workercode, t.timestamp1, t.action FROM TEST as t) as temp
GROUP BY temp.date, temp.workercode;
但是这段代码没有数据校验。
鉴于此数据:
workercode | timestamp | action |
01 | 19/07/20 09:00:00 | _in |
01 | 19/07/20 16:00:00 | _out |
01 | 20/07/20 09:00:00 | _in |
01 | 20/07/20 13:00:00 | _out |
02 | 16/07/20 09:00:00 | _in |
02 | 16/07/20 15:00:00 | _out |
我需要得到每个用户,他那天待了多少小时。类似于:
01 | 19/07/20 | 7 |
01 | 20/07/20 | 4 |
02 | 16/07/20 | 6 |
我正在尝试按 workercode
和 cast(timestamp, date)
分组,并在 select 上尝试类似 datediff 之类的方法,但我做不到。
有没有简单的方法来做到这一点?
提前致谢。
试试这个:
用于 MsSql。
// For MS SQL.
CREATE TABLE TEST(workercode int, timestamp DATETIME2, action NVARCHAR(10))
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '19/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '19/07/20 16:00:00', '_out')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '20/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (1, '20/07/20 13:00:00', '_out')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (2, '16/07/20 09:00:00', '_in')
INSERT INTO dbo.TEST(workercode, timestamp, action) VALUES (2, '16/07/20 15:00:00', '_out')
SELECT temp.workercode, temp.date, DATEDIFF(HOUR, MIN(temp.timestamp), MAX(temp.timestamp))
FROM (SELECT DATEFROMPARTS(Year(t.timestamp), Month(t.timestamp), Day(t.timestamp)) as date, t.workercode, t.timestamp, t.action FROM dbo.TEST as t) as temp
GROUP BY temp.date, temp.workercode
这是为了 MySql。
//For MySQL
CREATE TABLE TEST(workercode int, timestamp1 TIMESTAMP, action VARCHAR(10));
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "19/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "19/07/20 16:00:00", "_out");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "20/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (1, "20/07/20 13:00:00", "_out");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (2, "16/07/20 09:00:00", "_in");
INSERT INTO TEST(workercode, timestamp1, action) VALUES (2, "16/07/20 15:00:00", "_out");
SELECT temp.workercode, temp.date, TIMEDIFF(MAX(temp.timestamp1), MIN(temp.timestamp1))
FROM (SELECT DATE(CONCAT_WS('-',Year(t.timestamp1), Month(t.timestamp1), Day(t.timestamp1))) as date, t.workercode, t.timestamp1, t.action FROM TEST as t) as temp
GROUP BY temp.date, temp.workercode;
但是这段代码没有数据校验。