在特定时间之间忽略TIMESTAMPDIFF

时间:2016-02-17 21:14:33

标签: mysql sql

是否可以在几分钟内计算一笔金额,但不能在2300和0700之间的特定时间之间计算

SELECT SUM( TIMESTAMPDIFF(MINUTE, open_time, close_time)) 
FROM requests;

我上面的代码以分钟为单位计算时间,但也计算一夜之间,这是我想要避免的。

感谢您的帮助,我根本不是SQL专业人员!

2 个答案:

答案 0 :(得分:0)

尝试以下方法。它也应该适用于超过一个晚上的时期。

SELECT SUM( TIMESTAMPDIFF(MINUTE, open_time, close_time) - (DATEDIFF(close_time, open_time) * 480))
FROM requests;

答案 1 :(得分:0)

我不知道任何会返回指定结果的内置函数。而且我不知道任何可以处理所有可能情况的简单表达。

另一种方法是定义一个能够计算差异的函数(MySQL存储程序)。

举个例子,如果我们完全忽略日期时间/时间戳的任何“秒”部分,并使用整个分钟,就像这样:

注意:这是完全测试。 (考虑处理夏令时变化的开/关。这可能工作得很好,但尚未经过测试。这只是一种可能方法的演示。

SELECT t.open_time
     , t.close_time
     , worktimeminutes(t.open_time,t.close_time)  AS worktimeminutes
     , TIMESTAMPDIFF(MINUTE,t.open_time,t.close_time) AS tsdiff
  FROM ( SELECT NULL AS open_time, NULL AS close_time
         UNION ALL SELECT '2016-02-16 11:00', '2016-02-16 21:00'
         UNION ALL SELECT '2016-02-16 21:00', '2016-02-16 23:15'
         UNION ALL SELECT '2016-02-16 22:00', '2016-02-17 01:10'
         UNION ALL SELECT '2016-02-16 23:15', '2016-02-17 01:12'
         UNION ALL SELECT '2016-02-16 22:00', '2016-02-17 08:30'
         UNION ALL SELECT '2016-02-16 23:30', '2016-02-17 08:30'
         UNION ALL SELECT '2016-02-16 23:30', '2016-02-18 08:30'
    ) t

使用MySQL中定义的函数,我们可以运行一些简单的测试用例。我们可以在SELECT语句中引用该函数,就像内置函数一样。

open_time         close_time        worktimeminutes  tsdiff  
----------------  ----------------  ---------------  --------
(NULL)            (NULL)                     (NULL)    (NULL)
2016-02-16 11:00  2016-02-16 21:00              600       600
2016-02-16 21:00  2016-02-16 23:15              120       135
2016-02-16 22:00  2016-02-17 01:10               60       190
2016-02-16 23:15  2016-02-17 01:12                0       117
2016-02-16 22:00  2016-02-17 08:30              150       630
2016-02-16 23:30  2016-02-17 08:30               90       540
2016-02-16 23:30  2016-02-18 08:30             1050      1980

返回:

{{1}}