返回两个日期之间的行

时间:2014-09-09 20:03:48

标签: mysql sql date

我有ItemsRent表,

ID | ParentID | SubID |       StartDate      |       EndDate       |
--------------------------------------------------------------------
1  | 100      | 102   | 2014-09-09 17:40:00  | 2014-11-09 17:40:00 |
2  | 70       | 73    | 2014-08-09 14:20:00  | 2014-12-09 13:40:00 |

日期是sql格式。

我的输入日期是:

InputStartDate: 2014-09-09 18:00:00
InputEndDate: 2014-10-09 13:47:00

我想要返回两个日期之间的日期最佳行。例如:

Lets call StartDate as S, and EndDate as E.
And input dates will be InputStartDate as IS, and InputEndDate as IE.

S                E
|----------------|
         IS              IE
         |XXXXXXX--------|

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

通常情况下,我会说使用BETWEEN运算符,但由于您在表中存储了开始日期和结束日期,因此这将变得比它需要的更复杂。如果您假设存储的开始日期在结束日期之前,则只需执行两次检查。

SELECT * FROM `itemsRent` WHERE `StartDate` > 1410285600 AND `EndDate` < 1410356820

这将验证项目的开始日期是在指定的开始日期之后发生的。这个问题是它不会检查它是否发生在结束日期之前。您可以通过检查项目的结束日期是否在指定的结束日期之前进行,而不是明确地编写此检查。

注意:如果在结束日期之前没有开始日期,可能会导致问题。如果这是可能的,那么您将需要明确地编写这些检查。这将是使用BETWEEN操作的好例子。

答案 1 :(得分:1)

为什么不将表格中的最大结束日期作为高日期?

SELECT * 
FROM itemsRent
WHERE (InputStartDate BETWEEN startdate AND end date) 
  AND (InputEndDate BETWEEN startdate AND enddate);

答案 2 :(得分:1)

此查询将生成与您的插图相匹配的结果。它将查找在InputStartDateInputEndDate之间花费任何时间的所有行,并输出由InputStartDateInputEndDate限制的修改日期范围。

SELECT ID, ParentId, SubId,
       MAX( InputStartDate, StartDate ) AS Date_Start,
       MIN( InputEndDate, EndDate ) AS Date_End
FROM  `itemsRent` 
WHERE InputStartDate <= EndDate AND InputEndDate >= StartDate

答案 3 :(得分:0)

您的查询目前正在查找EndDate 早于 的行,而不是您提供的StartDate 提供的EndDate之后的行。我不认为这就是你想要的。

如果您希望StartDate和EndDate都在您提供的日期之间(我们称之为your-start-dateyour-end-date),您的查询应该是这样的:

SELECT * FROM `itemsRent` WHERE `StartDate` > your-start-date AND `StartDate` < your-end-date AND `EndDate` > your-start-date AND `EndDate` < your-send-date