【问题标题】:mysql select grouping by and datdiff on the rowsmysql 在行上选择分组依据和 datdiff
【发布时间】:2020-07-18 16:28:17
【问题描述】:

鉴于此数据:

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 |

我正在尝试按workercodecast(timestamp, date) 进行分组,并在选择时尝试使用 datediff 之类的方法,但我无法做到。 有没有简单的方法可以做到这一点?

提前致谢。

【问题讨论】:

  • 用您正在使用的数据库标记我们的问题。如果输入和输出不匹配会发生什么?如果给定的时间段跨越多天怎么办?
  • 不要考虑到这一点。在这种特殊情况下,不可能每个输入都没有输出,并且期间将在同一天内达到最大值。

标签: mysql datediff


【解决方案1】:

试试这个:

这是给 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;

但是这段代码没有数据检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多