MySQL开放时间的DateTime计算



因此,我们有以下MySQL表和开放时间:

+------+---------------------+---------------------+--------+
| Id   | StartTime           | EndTime             | ClubId |
+------+---------------------+---------------------+--------+
|    1 | 1970-01-04 20:00:00 | 1970-01-05 01:00:00 |  17424 |
|    2 | 1970-01-05 20:00:00 | 1970-01-06 01:00:00 |  17424 |
|    3 | 1970-01-06 20:00:00 | 1970-01-07 05:00:00 |  17424 |
|    4 | 1970-01-07 20:00:00 | 1970-01-01 05:00:00 |  17424 |
|    5 | 1970-01-01 22:00:00 | 1970-01-02 05:00:00 |  17426 |
|    6 | 1970-01-04 22:00:00 | 1970-01-05 05:00:00 |  17426 |
|    7 | 1970-01-05 22:00:00 | 1970-01-06 05:00:00 |  17426 |
|    8 | 1970-01-06 22:00:00 | 1970-01-07 05:00:00 |  17426 |
|    9 | 1970-01-07 22:00:00 | 1970-01-01 05:00:00 |  17426 |
|   10 | 1970-01-01 20:00:00 | 1970-01-02 04:00:00 |  17427 |
|   11 | 1970-01-03 20:00:00 | 1970-01-04 05:00:00 |  17427 |
|   12 | 1970-01-04 20:00:00 | 1970-01-05 05:00:00 |  17427 |
|   13 | 1970-01-05 20:00:00 | 1970-01-06 05:00:00 |  17427 |
|   14 | 1970-01-02 18:00:00 | 1970-01-03 03:00:00 |  17428 |
...

其中CCD_ 1是当业务打开时,CCD_ 2是当业务关闭时。我们不关心日期的年份和月份,但日期表示一周中的日期(尽管它可能与历史数据不匹配。1970-01-01可能是星期四,但由于我们不关心年份和月份的关系,我们也不关心历史背景。我们只是定义01代表星期日(,这就是我们所关心的。所以1970-01-07(星期六(之后是1970-01-01(星期日(。时间正是你对开放时间的期望。

例如,让我们看一下Id=1的位置:StartTime1970-01-04 20:00:00和EndTime1970-01-05 01:00:00意味着该俱乐部在Wednesday 8 PM开放,在StartTime0关闭。

我们需要做的(也是给我们带来麻烦的(是过滤这些条目,只显示当前正在营业的企业。我试着使用INBETWEEN关键字,但像Id = 9这样的条目(一周中的哪一天从7(星期六(到1(星期日((给我带来了麻烦。

如有任何帮助,我们将不胜感激:(有人有这样的经验吗?有没有关于如何将其放入MySQL查询的想法?我看到了这个问题,但是他们没有使用日期时间对象。如果无法避免,我们可以更改表并使用上面问题中提出的解决方案,但我们更喜欢使用DATETIME数据类型(如果可能的话(。

最有效的选择可能是将当前日期/时间转换为与表中日期表示形式一致的值。然后你可以进行直接过滤。

据我所知,你的问题是:

from_unixtime(unix_timestamp(now() + interval 3 day) % (60 * 60 * 24 * 7))

逻辑是使用模将当前日期/时间投影为epoch第一周的等效日期。需要额外的逻辑来将1970年1月1日重新映射为周日(而实际上是周四(:这就是+ interval 3 day所做的。

我们可以测试映射是否正确工作,如下所示:

select now(), 
from_unixtime(unix_timestamp(now() + interval 3 day) % (60 * 60 * 24 * 7)) ts_now

收益率:

now((|ts_now:------------------|:------------------2020-10-23 09:52:59|1970-01-05 10:52:59

然后您可以将其放入查询的where子句中。使用子查询可以方便地避免重复以下表达式:

select t.clubid
from mytable t
inner join (select from_unixtime(unix_timestamp(now() + interval 3 day) % (60 * 60 * 24 * 7)) ts_now) x
where t.starttime >= x.ts_now and t.endtime < x.ts_now

最新更新