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