2017-05-31 70 views
0

我要反其道而行之比這排除在給定的時間間隔時間戳在一週的給定幾天

SELECT * 
FROM cih 
WHERE location IS NOT NULL 
AND extract(dow FROM timestamp_client)<6 
AND extract(dow FROM timestamp_client)!=0 
AND extract(HOUR FROM timestamp_client)<=18 
AND extract(HOUR FROM timestamp_client)>=9 

我要的是提取數據,對於這些情況:

1. 0<dow<6 and (hour<9 or hour>18) 
2. dow=0 or dow=6 

但我不知道如何在PostgreSQL語法中編寫它。我該怎麼做?

回答

1
AND (extract(dow FROM timestamp_client) IN (0,6) OR 
NOT extract(hour FROM timestamp_client) BETWEEN 9 AND 18) 

這排除了09:00和18:59:59.999999之間在道1 - 5的一切。
需要括號。

還有很多其他的方法。最好的解決方案取決於完整的圖片。

0

讓我們命名您的條件:

A : 0 < dow < 6 
B : hour < 9 OR hour > 18 
C : dow = 0 OR dow = 6 

你的條件是:

1: A AND B OR 
2: C 

簡而言之:

A AND B OR C 

現在,讓我們來看看simplification rules,其中之一是:

C OR (A AND B) <==> (C OR A) AND (C OR B) 

由於dow僅可以從0至6的值,我們可以得出這樣的結論C <=> NOT A。現在

,您的簡化的條件是:

(NOT A OR A) AND (NOT A OR B) 

(NOT A OR A)始終是真實的,所以我們可以跳過它。

UFFF :)現在我們只有NOT A OR B。請記住,C <=> NOT A?如果是的話,我們有更簡單的形式:C OR B,這對於原來的條件是:

SELECT * 
FROM cih 
WHERE location IS NOT NULL AND (
extract(dow FROM timestamp_client) = 0 OR 
extract(dow FROM timestamp_client) = 6 OR 
extract(HOUR FROM timestamp_client) < 9 OR 
extract(HOUR FROM timestamp_client) > 18) 

不要忘記:

(hour < 9 OR hour > 18) OR (dow = 0 OR dow = 6) 

現在我們只OR可以簡單地在SQL中使用括號爲AND的優先級高於OR

這可以進一步簡化,就像@ErwinBrandstetter所做的那樣;)