簡體   English   中英

如何獲取“不在這兩個日期之間”的查詢結果

[英]How to get the query result for “not in between these two dates”

如何獲取“不在這兩個日期之間”的查詢結果

查詢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

怎么樣

 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)

獲取適當日期范圍內的時間范圍。

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

有一個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類型,請務必小心。 時間組件可以拋棄相等操作並使`之間返回意外結果。

“select * from log WHERE employee_id = 2 AND date between between 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'
)

我認為你想要指定用戶沒有記錄活動的所有日期。 以下解決方案基於另一個答案: 在兩個日期之間顯示所有日期數據; 如果特定日期不存在行,則在所有列中顯示零

    ;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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM