重要说明:如果您现在正在处理这个问题,请使用datastax的新cassandra-driver(即导入cassandra ),因为它解决了大多数常见问题,不要再使用旧的cql驱动程序,它已经过时了!这个问题在新驱动开发之前就存在了,我们不得不使用一个不完整的旧库,叫做cql(导入cql
简介我正在使用python库cql访问Cassandra 1.2数据库。在数据库中,我有一个带有时间戳列的表,在我的Python代码中,我在该列中插入了一个日期时间。示例如下:
桌子
CREATE TABLE test (
id text PRIMARY KEY,
last_sent timestamp
);
代码
import cql
import datetime
...
cql_statement = "update test set last_sent = :last_sent where id =:id"
rename_dict = {}
rename_dict['id'] = 'someid'
rename_dict['last_sent'] = datetime.datetime.now()
cursor.execute (cql_statement, rename_dict)
问题
当我执行代码时,实际执行的cql语句是这样的:
update test set last_sent =2013-05-13 15:12:51 where id = 'someid'
那么它会失败并出现错误
Bad Request: line 1:XX missing EOF at '-05'
问题似乎是cql库没有在运行查询之前转义(“”)或转换日期时间。
问题是,在不手动转义日期的情况下,如何正确地将完整的时间戳更精确地存储到cassandra时间戳列中?
提前致谢!
对我来说,它直接与
update test set last_sent = '2013-05-13 15:12:51' where id = 'someid'
无需转换某些内容。因此,在Python中,您可以使用日期时间值作为字符串来执行此操作:
cursor.execute("UPDATE test SET ts=:ts WHERE id=:id;",
dict(ts=your_datetime.isoformat(), id=id))
abhi已经说过这可以通过使用来自cqlsh的毫秒作为长值来实现,现在我们需要让它在Python代码中工作。
使用cql库时,此转换(从日期时间到自纪元以来的毫秒)不会发生,因此为了使更新工作并且仍然具有将日期时间转换为自纪元以来的毫秒所需的精度。
使用这个有用问题的源:从datetime获取自epoch以来的毫秒数,特别是这个函数(注意我做的小改动):
解决方案
import datetime
def unix_time(dt):
epoch = datetime.datetime.utcfromtimestamp(0)
delta = dt - epoch
return delta.total_seconds()
def unix_time_millis(dt):
return long(unix_time(dt) * 1000.0)
对于这个例子,代码应该是:
cql_statement = "update test set last_sent = :last_sent where id =:id"
rename_dict = {}
rename_dict['id'] = 'someid'
rename_dict['last_sent'] = unix_time_millis(datetime.datetime.now())
cursor.execute (cql_statement, rename_dict)
您可以将日期时间转换为包含自 epoch 以来的毫秒数的长整型值,仅此而已,更新将使用时间戳的长整型转换为等效形式。
希望它能帮助别人
我可以告诉你怎么用cqlsh做。试试这个
update test set last_sent =1368438171000 where id = 'someid'
日期时间 2013-05-13 15:12:51
的等效长值1368438171000
我们有带有日期字段(类型date)的表,将时间戳插入日期字段在某些oracle环境中工作(我们有多种开发环境),但在某些环境中失败。
问题内容: 我对约会有点困惑。我目前正在使用天气应用程序,并且一切正常。.我只是想将这种类型的格式处理成我自己想要的格式。 我只是想将此日期转换为大纪元时间,然后以所需的格式结算日期:: 对于J-SON 或者我想将此日期转换为更少的数字,例如,Sun,9月9日9:23 Am等。 http://dataservice.accuweather.com/currentconditions/v1/2570
我正在为我的聊天应用程序使用firebase。在聊天对象中,我使用方法添加时间戳。 请就这个问题提出解决办法
我已经尝试从firebase时间戳中获取日期和时间,如下所示: 但我得到的结果是:
问题内容: 论坛成员 我在Java中遇到日期时间问题。实际上,我正在接收 格式为2012-02-27T01:10:10 的开始日期,并且我想将接收到的日期插入具有datetime数据类型的数据库中。 实际上,我尝试通过以下代码将收到的开始日期转换为日期时间 但是使用上面的代码,只有 日期被添加到我的数据库中,例如2012-02-27 00:00:00 我也想将时间添加到数据库中,但是当我将Simp
问题内容: 如何在MySQL中转换为? 问题答案: 在MySQL中使用功能 请记住,如果使用的框架以毫秒为单位进行存储(例如Java的时间戳),则 必须除以1000 ,以秒为单位获取正确的Unix时间。