Interbase XE7 Precedence使用括号

时间:2015-05-25 11:39:37

标签: sql interbase operator-precedence

为了演示我遇到的问题,我使用的是一个表,其中DATE和TIME字段作为记录的一部分。 对于示例,我希望从一天的07:00到第二天的06:59过滤,所以我的查询如下:

SELECT * FROM V_W1W2_LOGS WHERE (V_W1W2_LOGS.W1_DATE >= '2015-05-20' AND V_W1W2_LOGS.W1_TIME >= '07:00:00') AND (V_W1W2_LOGS.W1_DATE<='2015-05-22' AND V_W1W2_LOGS.W1_TIME < '07:00:00') 

上面不会返回任何行。似乎表现得好像括号中没有优先顺序

作为测试,我做了以下操作。 如果我从'AND'的第二部分删除时间约束,将从07:00开始返回行,但是在第二天的整个期间。

(...) WHERE (V_W1W2_LOGS.W1_DATE >= '2015-05-20' AND V_W1W2_LOGS.W1_TIME >= '07:00:00') AND (V_W1W2_LOGS.W1_DATE<='2015-05-22')

按预期从07:00返回行

查询有明显错误吗? 我尝试了更多括号,不同的日期格式等,但它没有任何区别。 它似乎表现得好像括号不在那里。

我的拖网中没有看到任何与此有关的问题。如果记录中有时间戳,则可能更直接,但事实并非如此。 任何帮助表示赞赏。

由于

James F

2 个答案:

答案 0 :(得分:1)

第一个查询同时使用:

V_W1W2_LOGS.W1_TIME >= '07:00:00'

... AND ...

V_W1W2_LOGS.W1_TIME < '07:00:00'

...这是废话

也许你的意思是OR介于两者之间?

答案 1 :(得分:0)

除了对fanaghirocco的回答。

您应该分别使用timestamp代替datetime。 这样的事情:

SELECT * FROM table1
 WHERE
cast (fdate ||' '||ftime as timestamp) >= '2015-05-01 07:00:00'
 and
cast (fdate ||' '||ftime as timestamp) < '2015-05-02 07:00:00'