Postgresql 排除一周中给定时间间隔内的时间戳
我想做与此相反的事情:Postgresql 排除一周中给定时间间隔内的时间戳,postgresql,timestamp,Postgresql,Timestamp,我想做与此相反的事情: 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 我想要的是提取这些案例的数
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语法编写它。我怎么做
AND (extract(dow FROM timestamp_client) IN (0,6) OR
NOT extract(hour FROM timestamp_client) BETWEEN 9 AND 18)
这不包括道琼斯指数1-5在09:00和18:59:59.99999之间的所有数据。
需要括号
还有很多其他的方法。最佳解决方案取决于完整的情况。让我们说出您的情况:
A : 0 < dow < 6
B : hour < 9 OR hour > 18
C : dow = 0 OR dow = 6
简言之:
A AND B OR C
现在,让我们看看,其中之一是:
C OR (A AND B) <==> (C OR A) AND (C OR B)
不是A或A总是正确的,所以我们可以跳过它
Ufff:现在我们只有A或B。还记得C不是A吗?如果是,我们有更简单的形式:C或B,对于您的原始条件,它是:
(hour < 9 OR hour > 18) OR (dow = 0 OR dow = 6)
不要忘记括号as,它的优先级高于OR
这可以进一步简化,就像@ErwinBrandstetter所做的那样
(NOT A OR A) AND (NOT A OR B)
(hour < 9 OR hour > 18) OR (dow = 0 OR dow = 6)
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)