我有一个数据库表,我通过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?
答案 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级别上它仍将是一个字符串。