SQL - 在两个日期之间和之后记录

时间:2017-07-10 06:05:47

标签: mysql sql date

我正在编写查询以检查日期范围之间的两个日期。基本上它是休假申请。如果用户在2017-07-13''到2017-07-17',我想禁止用户在这两个日期申请另一个休假申请以及这两个日期之间的日期(即14,15和16)

我写过以下查询,并尝试使其成功但没有运气。在此先感谢

SELECT * FROM `leaves` WHERE emp_id=8 AND from_date BETWEEN'2017-07-12' AND 
'2017-07-14' AND to_date BETWEEN '2017-07-12' AND '2017-07-14' AND 
status!='Rejected'

表数据

| emp_id | from_date  | to_date    | status   |
|--------|------------|------------|----------|
| 8      | 2017-07-13 | 2017-07-17 | Approved |
| 8      | 2017-07-31 | 2017-07-31 | Pending  |

样本输入(输出)

  • 从date = 2017-07-14 AND到date = 2017-07-16(返回第一行)
  • 从date = 2017-07-12 AND到date = 2017-07-14(返回第一行)
  • 从date = 2017-07-14 AND到date = 2017-07-18(返回第一行)
  • 从date = 2017-07-15 AND date = 2017-07-15(返回第一行)
  • 从date = 2017-07-12 AND到date = 2017-07-12(什么都不返回)
  • 从date = 2017-07-18 AND date = 2017-07-18(不返回任何内容)

2 个答案:

答案 0 :(得分:1)

SELECT * 
  FROM leaves 
 WHERE emp_id = 8 
   AND status != 'Rejected' 
   AND from_date < '2017-07-16' 
   AND to_date > '2017-07-14'

请注意,出于此查询的目的,只要格式正确,您是否存储字符串或日期就没有区别。但由于其他原因,您应始终使用正确的数据类型存储数据。

此外,您可能希望将上述其中一个符号(但可能不是两者)更改为&lt; =或&gt; =

答案 1 :(得分:0)

SELECT * FROM `leaves`
WHERE emp_id=8 AND status != 'Rejected'
AND (
 (STR_TO_DATE(from_date, '%Y-%m-%d') BETWEEN '2017-07-10' AND '2017-07-15')
 OR (STR_TO_DATE(to_date, '%Y-%m-%d') BETWEEN '2017-07-10' AND '2017-07-15')
)
OR (
 (STR_TO_DATE(from_date, '%Y-%m-%d') <= '2017-07-10')
 AND (STR_TO_DATE(to_date, '%Y-%m-%d') >= '2017-07-15')
)