如何按照cassandra中的日期范围进行搜索?

时间:2016-02-10 16:54:27

标签: php cassandra cql

例如

SELECT *
FROM api_call_log
WHERE account_sid='XXXXXXXXXXXX'            AND 
      created_time >= 01-02-2016 00:00:00   AND
      created_time <= 31-02-2016 23:59:59
ALLOW FILTERING

虽然我搜索了第二个月,但我还是获得了第一个月的记录。

2 个答案:

答案 0 :(得分:1)

如果没有看到您的表格结构或结果集的相关部分,很难说。但我确实注意到你指定GMT偏移量,这意味着您实际上 通过默认本地偏移 进行查询。问题是,Cassandra按GMT + 0000存储。

例如,如果您的GMT偏移量为负-0600(与我一样),则对GMT-0600的查询将从2月1日起错过6小时的数据。例如,如果2016-02-01 01:00:00+0000有一行,则此查询不会返回它:

aploetz@cqlsh:stackoverflow> SELECT * FROm events WHERe monthbucket='201602' 
    AND eventdate >= '2016-02-01 00:00:00';

 monthbucket | eventdate | beginend | eventid | eventname
-------------+-----------+----------+---------+-----------

(0 rows)

那是因为2016-02-01 01:00:00+0000基本上是2016-01-31 19:00:00-0600。因此,如果我添加0000的GMT偏移量,我会看到该行。

aploetz@cqlsh:stackoverflow> SELECT * FROm events WHERe monthbucket='201602'
    AND eventdate >= '2016-02-01 00:00:00+0000';

 monthbucket | eventdate                | beginend | eventid                              | eventname
-------------+--------------------------+----------+--------------------------------------+-------------------
      201602 | 2016-02-01 01:00:00+0000 |        b | 78d2c2b7-c4ec-408f-be37-eccc0c05727d | test month border

(1 rows)

我的猜测是,由于具有 GMT偏移,您可能会遇到相反的问题(额外的行与丢失的行)。在查询中未指定偏移量可能是包含上个月的行的原因。如果是这种情况,那么您可能需要这些行。

另外,请勿使用ALLOW FILTERING。像往常一样。

答案 1 :(得分:-1)

试试这个

SELECT * FROM api_call_log WHERE account_sid='XXXXXXXXXXXX' AND jobs.created_at between '01-02-2016 00:00:00' and '31-02-2016 23:59:59';

并检查日期列的日期/时间格式