如何获取“不在这两个日期之间”的查询结果
查询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
答案 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。