【问题标题】:Select between date range ignoring the year在忽略年份的日期范围之间进行选择
【发布时间】:2015-11-04 19:24:33
【问题描述】:

我有一个表格,将开放日期存储在 2 列中,类型为 Date。我需要选择在某个日期范围内打开的条目,但不考虑年份。

为防止混淆,我将所有日期都写成YYYY-MM-DDMM-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-1312-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-0101-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 - 两者都必须为真。
  • 我认为您在查询中颠倒了运算符...尝试... &gt;= ... AND ... &lt;= ...
  • 您有一个范围为start/end(带年份)的表和一个只有月/日的start/end 范围?
  • 您希望商店在整个范围内开放吗?如果在该范围的一部分开放怎么办?

标签: mysql sql date select


【解决方案1】:

假设您有两个变量:@StartDate@EndDate。然后你可以把逻辑写成:

SELECT * 
FROM Dates
WHERE (DATE_FORMAT(@StartDate, '%m%d') <= DATE_FORMAT(@EndDate, '%m%d')  AND
       DATE_FORMAT(Start, '%m%d') <= DATE_FORMAT(@StartDate, '%m%d') AND 
       DATE_FORMAT(End, '%m%d') >= DATE_FORMAT(@EndDate, '%m%d') 
      ) OR
      (DATE_FORMAT(@StartDate, '%m%d') > DATE_FORMAT(@EndDate, '%m%d')  AND
       DATE_FORMAT(Start, '%m%d') > DATE_FORMAT(@StartDate, '%m%d') AND 
       DATE_FORMAT(End, '%m%d') < DATE_FORMAT(@EndDate, '%m%d') 
      );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2012-11-14
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多