如何获取“不在这两个日期之间”的查询结果

时间:2013-12-14 14:21:59

标签: php mysql

如何获取“不在这两个日期之间”的查询结果

查询1:

SELECT *
FROM   log
WHERE  employee_id = 2
AND    date BETWEEN '2013-12-01' and '2013-12-08'   

当我运行查询时,我得到了结果

2013-12-1
2013-12-5

但是如何得到结果“除上述两个以外的所有日期”。 或者,如何编写查询以获得下面的结果?

2013-12-2
2013-12-3
2013-12-4
2013-12-6
2013-12-7
2013-12-8

5 个答案:

答案 0 :(得分:4)

怎么样

 select * 
   from log 
  WHERE employee_id =2 
    AND NOT date between '2013-12-01' and '2013-12-08'

您也可以

 AND ( date < '2013-12-01'  OR date > '2013-12-08')

但是,如果您的date列的时间戳不是午夜时间,那么您需要更加思考范围。你需要

AND ( date < '2013-12-01' AND date >= ('2013-12-08' + INTERVAL 1 DAY)

获取适当日期范围内的时间范围。

答案 1 :(得分:0)

SELECT '2013-12-2'
UNION
SELECT '2013-12-3'
etc

答案 2 :(得分:0)

您可以使用SQL标准运算符NOT BETWEEN

select * 
from log 
WHERE employee_id = 2 and
      date not between '2013-12-01' and '2013-12-08';

这相当于:

select * 
from log 
WHERE employee_id = 2 and
      not (date between '2013-12-01' and '2013-12-08');

然而,后者在逻辑上是两个操作(计算“日期之间”部分然后否定结果)。第一个是一个操作。

顺便说一句,如果date确实存储为datetime类型,请务必小心。时间组件可以抛弃相等操作并使`返回意外结果。

答案 3 :(得分:0)

  

“从日志中选择* WHERE employee_id = 2和'2013-12-01'和'2013-12-08'之间的日期”

前面的查询返回'2013-10-1'和'2013-12-5',您正在寻找

2013-12-2
2013-12-3
2013-12-4
2013-12-6
2013-12-7
2013-12-8

但你的问题是how to get the query result not in between the date。这有道理吗?

无论如何根据您的预期结果。我想你正在寻找

select * from log WHERE employee_id =2 AND  date != '2013-12-01' and date != '2013-12-08'

SELECT * FROM another_tab WHERE date NOT IN (
    select date from log WHERE employee_id =2 AND  date BETWEEN '2013-12-01' and  '2013-12-08'
)

答案 4 :(得分:0)

我认为您希望指定用户没有记录活动时的所有日期。 以下解决方案基于另一个答案:SHOW ALL Dates data between two dates; if no row exists for particular date then show zero in all columns

    ;with d(date) as (
      select CAST('20131201' AS datetime)
      union all
      select date+1
      from d
      where date < CAST('20131208' AS datetime)
      )
    select d.date CDate
    from d
    left join [Log] l
           on l.[Date] = d.date AND l.employee_id=2
    WHERE l.employee_id IS NULL
    order by d.date
    OPTION (MAXRECURSION 0)

抱歉,这是针对SQL Server而不是MySQL,我没有看到MySQL标签......无论如何,我认为这是你所期望的,并且会有类似的MySQL解决方案。

修改

MySQL中似乎没有WITH子句:-(。如果您确定每天都有其他日志记录(其他用户操作,系统事件等),那么以下命令可能对您有用:

SELECT DISTINCT date FROM log l1 
  WHERE l1.date BETWEEN '2013-12-01' and '2013-12-08' 
  AND NOT EXISTS(SELECT * FROM log l2 WHERE 
                  l2.date = l1.date AND  l2.employee_id=2)

我没有测试它,因为我目前没有安装MySQL。