因此,我们有以下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
开放,在StartTime
0关闭。
我们需要做的(也是给我们带来麻烦的(是过滤这些条目,只显示当前正在营业的企业。我试着使用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