【问题标题】:Date between 2 other dates, disregarding year其他 2 个日期之间的日期,不考虑年份
【发布时间】:2013-08-18 01:07:59
【问题描述】:

我正在寻找类似 @​​987654321@ 正在寻找的人,但我想使用 MySQL。下表是您可以在我的数据库中找到的内容(简化版)。

+------+------+------+------+
| id   | name | first| last |
+------+------+------+------+
|    1 | John | 1020 | 0814 |
|    2 | Ram  | 0827 | 0420 |
|    3 | Jack | 0506 | 0120 |
|    4 | Jill | 0405 | 0220 |
|    5 | Zara | 1201 | 1219 |
+------+------+------+------+

首先,条目必须是随机的,而不是 id 4,我只想要 1 个条目。我解决了这个问题:SELECT * FROM test WHERE id <> 4 ORDER BY rand() LIMIT 1

在此表中,“first”和“last”列是格式为 mmdd(均为整数)的日期。所以约翰一年中的大部分时间都有空;从 10 月 20 日到 8 月 14 日。另一方面,Zara 只能在很短的时间内使用; 12 月 1 日至 12 月 19 日。

我的问题:如何更改我的查询以仅选择可用的人?我不能使用“between”,因为在 John 的情况下,1020 和 0814 之间没有任何内容。

我就是想不通,肯定还有其他人有类似的问题...有没有人有解决方案?

亲切的问候

【问题讨论】:

  • 所以firstlast 存储为整数而不是日期?为什么有些第一个值在最后一个值之后?在这种情况下,您怎么知道要搜索 first > last 还是 last > first?我还假设您的意思是 10 月 20 日。
  • 如果您首先将“日期”转换为实际的 MySQL DATE 值,则可以使用 BETWEEN。您可以使用STR_TO_DATE()STR_TO_DATE(first, '%m%d') 执行此操作。不过,@AndyG 指出的问题仍然存在。
  • @GreatBigBore 加 10000 到最后是不够的。在 John 的情况下,0101 应该考虑在 1020 和 0814 之间,但它不在 1020 和 10814 之间。

标签: php mysql date between


【解决方案1】:

你需要区分两种情况。

  1. first < last 时,日期为同一年。然后您可以使用between 来匹配日期。

  2. first > last时,表示last在下一年。在这种情况下,匹配的日期是date >= first OR date <= last

所以你的 WHERE 子句应该是:

WHERE IF(first < last, @date BETWEEN first AND last,
                       @date >= first OR date <= last)

【讨论】:

  • 特例不应该是BETWEEN last AND first,因为last &lt; first在特例中?
  • @GreatBigBore 1020 和 0814 之间没有数字。
  • 我确实弄错了比较的方向。我已经修好了。
  • 好的,对。我在想您的意思是将调整后的年份值附加到日期。
  • @AnyG & Tomas Creemers:我想到了这一点,但据我所知 str_to_date() 只格式化日期......而且我必须添加一年,因为没有字段类型只保存 mmdd ......在我的情况下,没有一年可用,因为从理论上讲,这将永远持续下去。 @Barmar 所以我的查询,当使用 php 时,会变成:SELECT * FROM test WHERE id &lt;&gt; 4 AND (IF(first &lt; last, $date BETWEEN first AND last, $date &gt;= first OR $date &lt;= last)) ORDER BY rand() LIMIT 1。我将进一步研究 SQL 中的 IF 语句!感谢您的回答!
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多