在SQLAlchemy中将字符串转换为日期时间戳

时间:2014-01-14 23:39:40

标签: python sql datetime sqlalchemy

我有一个数据库表,我通过SQLAlchemy访问它。每一行都有时间戳,但不幸的是,它不仅仅是一个DATE类型的列。

带有两列的时间戳。一个是日期为字符串(不是ISO格式“YYYY-MM-DD”格式,而是以英联邦“DD / MM / YYYY”格式。)另一个是时间< em> as a string 。

我可以将数据导入Python并使用datetime.datetime将其转换为strptime,但我想过滤SQL中的行。

如何编写SQL来完成Python的strptime? - 例如获取字符串的连接部分并将其解释为日期? (我可以算date->string,但不是字符串 - &gt;日期。)

如何说服SQLAlchemy生成该SQL?

1 个答案:

答案 0 :(得分:1)

在sqlite上,您需要转换文本。以下可能有所帮助:

qry = session.query(SomeTable)
dt_column =(func.substr(SomeTable.date, 7) + "-" +
            func.substr(SomeTable.date, 4, 2) + "-" +
            func.substr(SomeTable.date, 1, 2) + " " + SomeTable.time)
dt_column = func.datetime(dt_column)
qry = qry.filter(dt_column <= datetime(2013, 1, 1, 23, 59, 59))

更好的方法是使用sqlalchemy Hybrid Attributes,这样你就可以在python级别和数据库上获得datetime字段:

class SomeTable(Base):
    __tablename__ = 'some_table'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    date = Column(String)
    time = Column(String)

    @hybrid_property
    def datetime(self):
        # @todo: add python parsing of date and time to produce the result
        str_value = self.date + self.time
        return datetime.strptime(str_value, "%d/%m/%Y%H:%M:%S")

    @datetime.expression
    def datetime(cls):
        # @note: query specific value
        dt_column =(func.substr(cls.date, 7) + "-" +
                    func.substr(cls.date, 4, 2) + "-" +
                    func.substr(cls.date, 1, 2) + " " + cls.time)
        dt_column = func.datetime(dt_column)
        return dt_column

...
qry = session.query(SomeTable)
qry = qry.filter(SomeTable.datetime <= datetime(2013, 1, 1, 23, 59, 59))

请注意,在客户端上您将拥有datetime实例,而在sqlite级别上它仍将是一个字符串。