【发布时间】:2015-11-04 19:24:33
【问题描述】:
我有一个表格,将开放日期存储在 2 列中,类型为 Date。我需要选择在某个日期范围内打开的条目,但不考虑年份。
为防止混淆,我将所有日期都写成YYYY-MM-DD 或MM-DD 格式。
这是一个简单的表格示例。
| ID | Start | End |
| 1 | 2014-12-01 | 2014-12-31 |
| 2 | 2015-11-18 | 2016-01-20 |
| 3 | 2015-01-01 | 2016-01-18 |
| 4 | 2015-12-10 | 2015-12-20 |
基于this post,我能够查找同一年的条目。例如,如果我要查找在 12-13 和 12-15 之间打开的任何内容,则此查询将为我提供第 1 行和第 4 行。
SELECT *
FROM Dates
WHERE
DATE_FORMAT(Start, "%m%d") <= DATE_FORMAT("2015-12-13", "%m%d") AND
DATE_FORMAT(End, "%m%d") >= DATE_FORMAT("2016-12-15", "%m%d")
但是,在 12-01 和 01-13 之间查找条目将无法使用。
有人知道我怎么能做到这一点吗?
编辑
让所有感兴趣的人都有测试台。
CREATE TABLE `Dates` (
`idDates` int(11) NOT NULL AUTO_INCREMENT,
`Start` date DEFAULT NULL,
`End` date DEFAULT NULL,
PRIMARY KEY (`idDates`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `Dates`
(`idDates`,
`Start`,
`End`)
VALUES
('1', '2014-12-01', '2014-12-31'),
('2', '2015-11-18', '2016-01-20'),
('3', '2015-01-01', '2016-01-18'),
('4', '2015-12-10', '2015-12-20');
【问题讨论】:
-
记住:“日期”实际上是一个数字,代表一个时间点。它不是包含不同月份、日期和年份值的“记录”。因此,您不能轻易地说“给我 12 月 15 日至 12 月 27 日之间的所有记录,无论这两个日期发生在哪一年”。
-
你确定逻辑是对的吗? 'start' 小于或等于 13/12/2015 并且 'end' 大于或等于 15/12/2015 - 两者都必须为真。
-
我认为您在查询中颠倒了运算符...尝试
... >= ... AND ... <= ... -
您有一个范围为
start/end(带年份)的表和一个只有月/日的start/end范围? -
您希望商店在整个范围内开放吗?如果在该范围的一部分开放怎么办?