在一周中的给定日期排除给定时间间隔内的时间戳

时间:2017-05-31 16:47:56

标签: postgresql timestamp

我想做与此相反的事情:

    page = soup.find(None, "div", class_='12345').find('a')
AttributeError: 'NoneType' object has no attribute 'find'

我想要的是提取这些案例的数据:

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

但我不知道如何用PostgreSQL语法编写它。我该怎么办?

2 个答案:

答案 0 :(得分: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道的所有内容 需要括号。

还有很多其他方法。最佳解决方案取决于完整的图片。

答案 1 :(得分: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,对于您的原始条件是:

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

现在我们只有OR可以在SQL中使用:

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)

不要忘记括号,因为AND的优先级高于OR

这可以进一步简化,就像@ErwinBrandstetter所做的那样;)