是否可以根据包含文本的同一字段中的时间戳计算时差?这是我的用餐日期:
ID, FIELD1, totalTime
'1', '2018-06-03 09h56##firstname.lastname##2018-06-03 16h45##firstname.lastname', ''
'2', '2018-02-06 17h24##firstname.lastname##2018-02-06 21h03##firstname.lastname', ''
'3', '2018-01-01 02h23##firstname.lastname##2018-01-01 17h24##firstname.lastname', ''
所以我需要计算每行的时间:例如:(2018-02-03 16h45)-(2018-02-03 09h56)
我的SQL知识还不错,但是我无法弄清楚如何在同一领域做这样的事情。
谢谢
伊丽莎白
答案 0 :(得分:0)
我会使用主力函数SUBSTRING_INDEX
和STR_TO_DATE
。 TIMESTAMPDIFF
函数可以计算DATETIME值之间的差。
(我将跳过有关不在一个大文本列中存储多个日期时间和字符串的讨论。可以说这是SQL反模式,并且是错误的做法。)
SQL中的字符串处理非常糟糕(SQL很快变丑),但是我们可以处理一些基本的,定义明确的操作。
因为在列值中有常规定界符##
,所以如果有保证,我们可以利用SUBSTRING_INDEX
函数提取这些定界符之间的部分。
作为演示:
SELECT -- extract string parts
SUBSTRING_INDEX(t.field1,'##',1) AS d1_str
, SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) AS d2_str
-- convert stringparts to DATETIME
, STR_TO_DATE( SUBSTRING_INDEX(t.field1,'##',1) ,'%Y-%m-%d %Hh%i') AS d1_dt
, STR_TO_DATE( SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) ,'%Y-%m-%d %Hh%i') AS d2_dt
-- calculate time difference (in minutes) of the DATETIME
, TIMESTAMPDIFF(MINUTE
, STR_TO_DATE( SUBSTRING_INDEX(t.field1,'##',1) , '%Y-%m-%d %Hh%i')
, STR_TO_DATE( SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) , '%Y-%m-%d %Hh%i')
) AS diff_minutes
FROM ( SELECT '1'+0 AS id, '2018-06-03 09h56##firstname.lastname##2018-06-03 16h45##firstname.lastname' AS field1
UNION ALL SELECT '2'+0, '2018-02-06 17h24##firstname.lastname##2018-02-06 21h03##firstname.lastname'
UNION ALL SELECT '3'+0, '2018-01-01 02h23##firstname.lastname##2018-01-01 17h24##firstname.lastname'
) t
返回:
d1_str d2_str d1_dt d2_dt diff_minutes
---------------- ---------------- ------------------- ------------------- ------------
2018-06-03 09h56 2018-06-03 16h45 2018-06-03 09:56:00 2018-06-03 16:45:00 409
2018-02-06 17h24 2018-02-06 21h03 2018-02-06 17:24:00 2018-02-06 21:03:00 219
2018-01-01 02h23 2018-01-01 17h24 2018-01-01 02:23:00 2018-01-01 17:24:00 901