根据时区和当前时间获取工作日

时间:2020-07-22 12:52:51

标签: mysql

我具有下面的表结构,其中day_index 0 =星期一,1 =星期二,6 =星期日。这里的start_time和end_time是UTC时间。

day_index  hour_string          start_time  end_time
        0  05:30 AM - 05:30 PM  07:30 PM    07:30 AM
        1  10:00 AM - 08:00 PM  12:00 AM    10:00 AM
        2  07:30 AM - 11:30 PM  09:30 PM    01:30 PM
        3  09:00 AM - 02:30 PM  11:00 PM    04:30 AM
        4  09:00 AM - 04:00 PM  11:00 PM    06:00 AM
        5  08:30 AM - 03:30 PM  10:30 PM    05:30 AM
        6  08:30 AM - 11:00 PM  10:30 PM    01:00 PM

现在根据今天的时间,我需要像今天这样的整个工作日,所以今天我们有22-07-2020,所以应该是20-07-2020,21-07-2020,最后一个是27-07-2020。

此外,如果今天时间结束(带有timezone的end_time),我需要下一个有start_time的可用日期。

示例:在今天的情况下,我们的UTC为1.30 PM + 5.30 = 6.30。因此,我们的下一个开放时间将是世界标准时间下午11:00 +上午5.30 = 4.30。

2 个答案:

答案 0 :(得分:1)

您熟悉CONVERT_TZ吗?这就是将日期时间转换为另一个时区的方法。您不能将没有日期的时间转换为时区。

在运行查询之前,需要设置一些变量;

SET @last_monday = DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY);
SET @local_timezone = 'US/Eastern';

此查询将为您提供一周中每一天的日期,UTC的开始和结束时间以及本地时区的开始和结束时间:

SELECT DATE_ADD(@last_monday, INTERVAL day_index DAY) date_dayofweek,
TIMESTAMP(CONCAT(DATE_ADD(@last_monday, INTERVAL day_index DAY),' ',start_time)) startDateTimeUTC,
TIMESTAMP(CONCAT(DATE_ADD(@last_monday, INTERVAL day_index DAY),' ',end_time)) endDateTimeUTC,
CONVERT_TZ(TIMESTAMP(CONCAT(DATE_ADD(@last_monday, INTERVAL day_index DAY),' ',start_time)),'UTC',@local_timezone) startDateTimeLocal,
CONVERT_TZ(TIMESTAMP(CONCAT(DATE_ADD(@last_monday, INTERVAL day_index DAY),' ',end_time)),'UTC',@local_timezone) endDateTimeLocal
FROM table_name ;

在这里使用答案来获取上周一- MYSQL: How can I find 'last monday's date' (performance Issue)

您还可以在查询中使用变量,以使此查询更具可读性,因为重复很多。我不确定这是否会让您感到困惑,但是很高兴为您提供查询(如果需要)。

答案 1 :(得分:-1)

这是一个棘手的mysql查询,但是在another answer的帮助下,解决起来非常简单。

SELECT 
    DATE_ADD(DATE_ADD(CURDATE(),
            INTERVAL - WEEKDAY(CURDATE()) DAY),
        INTERVAL day_index DAY)
FROM
    schedule
相关问题