繁体   English   中英

如何将 integer(纪元)列转换为 sqlalchemy 中的日期时间?

[英]How to cast integer (epoch) column to datetime in sqlalchemy?

I'm using sqlalchemy to query a database and have a Table.c.Field object from inspect, where Field is of type integer (eg, 1596657600). 如何将该字段转换为日期时间? 在查询中,我想将字段转换为日期时间,然后提取并按星期几分组(或日期时间的其他方面)。 但首先我需要将字段转换为日期或日期时间。

我尝试了几种方法,但都失败了。 在下面的代码中,我首先将 sqlalchemy 导入为 sa。

我试过了

sa.func.to_timestamp(Table.c.Field / 1.0).cast(sa.Date)

正如这里建议的那样。 但它会产生错误: no such function: to_timestamp

我试过了

Table.c.Field.cast(sa.DateTime)

正如这里建议的那样。 但在那个链接中,它会产生错误: Couldn't parse datetime string '1596657600' - value is not a string 如果有帮助,我正在查询的数据库也是 Sqlite,但我希望我的解决方案适用于任何数据库中的任何 integer 字段。

我也试过

sa.cast(Table.c.Field, SQA.Interval)

但它产生了同样的错误: Couldn't parse datetime string '1596657600' - value is not a string

如果解决方案是创建一些特殊的 function(例如 Fx)来做转换,用作

(Table.c.Field).Fx()

function 会是什么样子? 或者什么样的 function 可以解决问题? 我无法写入数据库,需要通过单个 sqlalchemy 查询进行所有计算(转换、分组、过滤等)。

我在文档中找到了一个解决方案,但起初我不确定如何在我的案例中应用它。

首先,创建一个接受整数的新类型,然后简单地将 Field 转换为该类型。 我首先将 sqlalchemy 作为 SQA 导入,然后从 datetime 导入 tzinfo 和 datetime 和 timedelta。

class MyEpochType(SQA.types.TypeDecorator):
    impl = SQA.types.Integer
    epoch = datetime(1970, 1, 1, 0, 0, 0, tzinfo=pytz.timezone('UTC'))
    
    def process_bind_param(self, value, dialect):
        return (value / 1000 - self.epoch).total_seconds()

    def process_result_value(self, value, dialect):
        return self.epoch + timedelta(seconds=value )

Table.c.Field.cast(MyEpochType)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM