Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 指定时间范围内两个日期之间的运行时间_Mysql_Sql - Fatal编程技术网

Mysql 指定时间范围内两个日期之间的运行时间

Mysql 指定时间范围内两个日期之间的运行时间,mysql,sql,Mysql,Sql,我有一个MYSQL表,它有一个时间戳列'Start'和一个时间戳列'End'。我想返回开始和结束之间的分钟数,结束总是在开始之后。通常我只使用“TIMESTAMPDIFF”,但这次我需要获得该日期范围内每天从上午9点到晚上22点的分钟数 如果一行的开始时间为“2017-01-01 07:15:00”,结束时间为“2017-01-02 11:30:00”,则经过的时间应为15.5小时930分钟 我很难想出一个像样的方法来做这件事,我在网上的搜索还没有找到我想要的东西。有人能帮我吗 编辑: 我想到了

我有一个MYSQL表,它有一个时间戳列'Start'和一个时间戳列'End'。我想返回开始和结束之间的分钟数,结束总是在开始之后。通常我只使用“TIMESTAMPDIFF”,但这次我需要获得该日期范围内每天从上午9点到晚上22点的分钟数

如果一行的开始时间为“2017-01-01 07:15:00”,结束时间为“2017-01-02 11:30:00”,则经过的时间应为15.5小时930分钟

我很难想出一个像样的方法来做这件事,我在网上的搜索还没有找到我想要的东西。有人能帮我吗

编辑:

我想到了这个:

SELECT Start, End, TIMESTAMPDIFF(MINUTE, Start, End) AS MinutesElapsed
FROM date_ranges;
我遗漏了以分钟为单位的时间仅在指定的时间范围(上午9点到晚上22点)内计算的部分。有什么想法吗?

给你:

SELECT t1, t2, (TIMESTAMPDIFF(MINUTE, t1, t2) - TIMESTAMPDIFF(DAY, t1, t2)*660) FROM

(SELECT CASE WHEN t1 < STR_TO_DATE(concat(date_format(t1, '%Y-%m-%d'), ' 09:00:00'), '%Y-%m-%d %h:%i:%s')
THEN STR_TO_DATE(concat(date_format(t1, '%Y-%m-%d'), ' 09:00:00'), '%Y-%m-%d %h:%i:%s')
ELSE t1
END AS t1 FROM test) test1,

(SELECT CASE WHEN t2 > STR_TO_DATE(concat(date_format(t2, '%Y-%m-%d'), ' 22:00:00'), '%Y-%m-%d %h:%i:%s')
THEN STR_TO_DATE(concat(date_format(t2, '%Y-%m-%d'), ' 22:00:00'), '%Y-%m-%d %h:%i:%s')
ELSE t2
END AS t2 FROM test) test2;
660=22:00和09:00之间的分钟数11小时

这是答案。

给你:

SELECT t1, t2, (TIMESTAMPDIFF(MINUTE, t1, t2) - TIMESTAMPDIFF(DAY, t1, t2)*660) FROM

(SELECT CASE WHEN t1 < STR_TO_DATE(concat(date_format(t1, '%Y-%m-%d'), ' 09:00:00'), '%Y-%m-%d %h:%i:%s')
THEN STR_TO_DATE(concat(date_format(t1, '%Y-%m-%d'), ' 09:00:00'), '%Y-%m-%d %h:%i:%s')
ELSE t1
END AS t1 FROM test) test1,

(SELECT CASE WHEN t2 > STR_TO_DATE(concat(date_format(t2, '%Y-%m-%d'), ' 22:00:00'), '%Y-%m-%d %h:%i:%s')
THEN STR_TO_DATE(concat(date_format(t2, '%Y-%m-%d'), ' 22:00:00'), '%Y-%m-%d %h:%i:%s')
ELSE t2
END AS t2 FROM test) test2;
660=22:00和09:00之间的分钟数11小时


以下是。

它不是很简洁,但这会给你想要的结果:

select started_at,ended_at,
  (case 
  when date(ended_at) = date(started_at)
  then 
    timestampdiff(
      minute,
      greatest(started_at,concat(date(started_at),' 09:00:00')),
      least(ended_at,concat(date(ended_at),' 22:00:00')) 
    )
  else
    timestampdiff(
      minute,  
      least(greatest(started_at,concat(date(started_at),' 09:00:00')),concat(date(started_at),' 22:00:00')),
      concat(date(started_at),' 22:00:00')
    )
    + 
    timestampdiff(
      minute,  
      concat(date(ended_at),' 09:00:00'),
      greatest(least(ended_at,concat(date(ended_at),' 22:00:00')),concat(date(ended_at),' 09:00:00'))
    )    
    + ((datediff(ended_at,started_at)-1)*780) 
  end) as total_minutes
from your_table;

它不是很简洁,但这会给你想要的结果:

select started_at,ended_at,
  (case 
  when date(ended_at) = date(started_at)
  then 
    timestampdiff(
      minute,
      greatest(started_at,concat(date(started_at),' 09:00:00')),
      least(ended_at,concat(date(ended_at),' 22:00:00')) 
    )
  else
    timestampdiff(
      minute,  
      least(greatest(started_at,concat(date(started_at),' 09:00:00')),concat(date(started_at),' 22:00:00')),
      concat(date(started_at),' 22:00:00')
    )
    + 
    timestampdiff(
      minute,  
      concat(date(ended_at),' 09:00:00'),
      greatest(least(ended_at,concat(date(ended_at),' 22:00:00')),concat(date(ended_at),' 09:00:00'))
    )    
    + ((datediff(ended_at,started_at)-1)*780) 
  end) as total_minutes
from your_table;
具有指定年数的日期。每个日期的开始时间为09:00,结束时间为22:00。 此表上的左联接可从日期范围表中获取每个日期一行。 总结每天的差异,得出总工作时间。 具有指定年数的日期。每个日期的开始时间为09:00,结束时间为22:00。 此表上的左联接可从日期范围表中获取每个日期一行。 总结每天的差异,得出总工作时间。 问题是,我想知道第一天有多少分钟,最后一天有多少分钟,中间几天有780分钟

我使用子查询只是为了帮助中间计算

select
    if(hour(t1) < 9, date(t1) + interval 9 hour , t1) as tIni1,
    date(t1) + interval 22 hour as tFin1,
    date(t2) + interval 9 hour as tIni2,
    if(hour(t2) >  22, date(t2) + interval 22 hour, t2) as tFin2,
    TIMESTAMPDIFF(day, date(t1), date(t2)) numDays
from
    tdt
tIni1和tFin1是第一天的周期,tIni2和tFin2是最后一天的周期,显然第一天和最后一天可以相同

然后计算第一天的分钟数+第二天的分钟数+每中间天780分钟

select numDays, tIni1, tFin1, tIni2, tFin2,
    if (numDays = 0,
        TIMESTAMPDIFF(minute, tIni1, tFin2),
            TIMESTAMPDIFF(minute, tIni1, tFin1)
            + TIMESTAMPDIFF(minute, tIni2, tFin2)
            + (numDays - 1) * 780
        ) as Minutes
from (
        select
            if(hour(t1) < 9, date(t1) + interval 9 hour , t1) as tIni1,
            date(t1) + interval 22 hour as tFin1,
            date(t2) + interval 9 hour as tIni2,
            if(hour(t2) >  22, date(t2) + interval 22 hour, t2) as tFin2,
            TIMESTAMPDIFF(day, date(t1), date(t2)) numDays
        from
            tdt
    ) ti
; 
请在此处尝试:

问题是,我想知道第一天有多少分钟,最后一天有多少分钟,中间几天有780分钟

我使用子查询只是为了帮助中间计算

select
    if(hour(t1) < 9, date(t1) + interval 9 hour , t1) as tIni1,
    date(t1) + interval 22 hour as tFin1,
    date(t2) + interval 9 hour as tIni2,
    if(hour(t2) >  22, date(t2) + interval 22 hour, t2) as tFin2,
    TIMESTAMPDIFF(day, date(t1), date(t2)) numDays
from
    tdt
tIni1和tFin1是第一天的周期,tIni2和tFin2是最后一天的周期,显然第一天和最后一天可以相同

然后计算第一天的分钟数+第二天的分钟数+每中间天780分钟

select numDays, tIni1, tFin1, tIni2, tFin2,
    if (numDays = 0,
        TIMESTAMPDIFF(minute, tIni1, tFin2),
            TIMESTAMPDIFF(minute, tIni1, tFin1)
            + TIMESTAMPDIFF(minute, tIni2, tFin2)
            + (numDays - 1) * 780
        ) as Minutes
from (
        select
            if(hour(t1) < 9, date(t1) + interval 9 hour , t1) as tIni1,
            date(t1) + interval 22 hour as tFin1,
            date(t2) + interval 9 hour as tIni2,
            if(hour(t2) >  22, date(t2) + interval 22 hour, t2) as tFin2,
            TIMESTAMPDIFF(day, date(t1), date(t2)) numDays
        from
            tdt
    ) ti
; 

请在此处尝试:

您使用哪种编程语言?数据库中是否有日历表?@Rashad据我所知,该函数必须从9计算到22,并从9添加到11,在您的示例中。您使用哪种编程语言?数据库中是否有日历表?@Rashad据我所知,它是mysqls函数必须从9计算到22,并从9添加到11,在您的示例中,09:00和22:00之间的分钟数实际上是780 13*60。09:00和22:00之间的分钟数实际上是780 13*60。