Odd*_*ing 4 python sql datetime sqlalchemy
我有一个数据库表,我通过 SQLAlchemy 访问该表。每行都有时间戳,但不幸的是它不仅仅是具有 DATE 类型的列。
它有两列时间戳。一种是字符串形式的日期(不是 ISO 格式“YYYY-MM-DD”格式,而是英联邦“DD/MM/YYYY”格式。),另一种是字符串形式的时间。
我可以将数据输入 Python 并将其转换为 with datetime.datetime,strptime但我想过滤 SQL 中的行。
我如何编写 SQL 来完成与 Python 的 strptime 等效的操作?- 例如,获取字符串的连接部分并将其解释为日期?(我可以算出date->string,但不能算出 string->date 。)
我如何说服 SQLAlchemy 生成该 SQL?
在 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 级别上它仍然是一个字符串。