将列日期时间值拆分为多列
Split column datetime values with into multiple columns
使用 MySQL 查询,我怎样才能像示例 A 中那样获取 table:
示例 A
ID
时间
log_type
1111
2021-06-01 07:13:42.000000
输入
1111
2021-06-01 17:13:42.000000
输出
1111
2021-06-03 07:00:42.000000
输入
1111
2021-06-03 17:00:42.000000
输出
2222
2021-06-01 07:13:42.000000
输入
2222
2021-06-01 17:13:42.000000
输出
2222
2021-06-03 07:00:42.000000
输入
2222
2021-06-03 17:00:42.000000
输出
并创建一个类似示例 B 的视图?
示例 B
ID
日期
输入
输出
1111
2021-06-01
上午 7:13
下午 4:30
1111
2021-06-02
不适用
不适用
1111
2021-06-03
上午 7:00
下午 4:00
2222
2021-06-01
上午 7:13
下午 4:30
2222
2021-06-02
不适用
不适用
2222
2021-06-03
上午 7:00
下午 4:00
WITH RECURSIVE
cte1 AS ( SELECT MIN(DATE(`time`)) `date`, MAX(DATE(`time`)) maxtime
FROM test
UNION ALL
SELECT `date` + INTERVAL 1 DAY, maxtime
FROM cte1
WHERE `date` < maxtime ),
cte2 AS ( SELECT DISTINCT id
FROM test )
SELECT cte2.id,
cte1.`date`,
COALESCE(TIME(t1.`time`), 'N/A') `IN`,
COALESCE(TIME(t2.`time`), 'N/A') `OUT`
FROM cte1
CROSS JOIN cte2
LEFT JOIN test t1 ON t1.id = cte2.id
AND cte1.`date` = DATE(t1.`time`)
AND t1.log_type = 'IN'
LEFT JOIN test t2 ON t2.id = cte2.id
AND cte1.`date` = DATE(t2.`time`)
AND t2.log_type = 'OUT'
ORDER BY 1,2
https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=51236ef22fcaaba3f2d9af9acf7f6c55
where do we put our variable, to return from_date to_date – Ashanti
WITH RECURSIVE
cte1 AS ( SELECT '{from_date}' `date`
UNION ALL
SELECT `date` + INTERVAL 1 DAY
FROM cte1
WHERE `date` < '{to_date}' ),
...
使用 MySQL 查询,我怎样才能像示例 A 中那样获取 table:
示例 A
ID | 时间 | log_type |
---|---|---|
1111 | 2021-06-01 07:13:42.000000 | 输入 |
1111 | 2021-06-01 17:13:42.000000 | 输出 |
1111 | 2021-06-03 07:00:42.000000 | 输入 |
1111 | 2021-06-03 17:00:42.000000 | 输出 |
2222 | 2021-06-01 07:13:42.000000 | 输入 |
2222 | 2021-06-01 17:13:42.000000 | 输出 |
2222 | 2021-06-03 07:00:42.000000 | 输入 |
2222 | 2021-06-03 17:00:42.000000 | 输出 |
并创建一个类似示例 B 的视图?
示例 B
ID | 日期 | 输入 | 输出 |
---|---|---|---|
1111 | 2021-06-01 | 上午 7:13 | 下午 4:30 |
1111 | 2021-06-02 | 不适用 | 不适用 |
1111 | 2021-06-03 | 上午 7:00 | 下午 4:00 |
2222 | 2021-06-01 | 上午 7:13 | 下午 4:30 |
2222 | 2021-06-02 | 不适用 | 不适用 |
2222 | 2021-06-03 | 上午 7:00 | 下午 4:00 |
WITH RECURSIVE
cte1 AS ( SELECT MIN(DATE(`time`)) `date`, MAX(DATE(`time`)) maxtime
FROM test
UNION ALL
SELECT `date` + INTERVAL 1 DAY, maxtime
FROM cte1
WHERE `date` < maxtime ),
cte2 AS ( SELECT DISTINCT id
FROM test )
SELECT cte2.id,
cte1.`date`,
COALESCE(TIME(t1.`time`), 'N/A') `IN`,
COALESCE(TIME(t2.`time`), 'N/A') `OUT`
FROM cte1
CROSS JOIN cte2
LEFT JOIN test t1 ON t1.id = cte2.id
AND cte1.`date` = DATE(t1.`time`)
AND t1.log_type = 'IN'
LEFT JOIN test t2 ON t2.id = cte2.id
AND cte1.`date` = DATE(t2.`time`)
AND t2.log_type = 'OUT'
ORDER BY 1,2
https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=51236ef22fcaaba3f2d9af9acf7f6c55
where do we put our variable, to return from_date to_date – Ashanti
WITH RECURSIVE
cte1 AS ( SELECT '{from_date}' `date`
UNION ALL
SELECT `date` + INTERVAL 1 DAY
FROM cte1
WHERE `date` < '{to_date}' ),
...