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

Odd*_*ing 4 python sql datetime sqlalchemy

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

它有两列时间戳。一种是字符串形式的日期(不是 ISO 格式“YYYY-MM-DD”格式,而是英联邦“DD/MM/YYYY”格式。),另一种是字符串形式的时间。

我可以将数据输入 Python 并将其转换为 with datetime.datetimestrptime但我想过滤 SQL 中的行。

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

我如何说服 SQLAlchemy 生成该 SQL?

van*_*van 6

在 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))
Run Code Online (Sandbox Code Playgroud)

更好的是使用sqlalchemy Hybrid Attributes,这样你就可以在 python 级别和数据库上获取日期时间字段:

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))
Run Code Online (Sandbox Code Playgroud)

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