2014-01-14 177 views
2

我有一個數據庫表,我通過SQLAlchemy訪問該表。每行都有時間戳,但不幸的是,它不僅僅是一個DATE類型的列。將字符串轉換爲SQLAlchemy中的日期時間戳

這是兩列的時間戳。一個是日期作爲字符串(不採用ISO格式「YYYY-MM-DD」格式,但採用英聯邦「DD/MM/YYYY」格式),另一個是時間,字符串爲

我可以將數據導入Python並將其轉換爲datetime.datetimestrptime但我想過濾SQL中的行。

我該如何編寫SQL來完成相當於Python的代碼? - 例如取一個字符串的連接部分並將其解釋爲日期? (我可以計算出date->string,但不是字符串 - >日期。)

如何說服SQLAlchemy生成該SQL?

+1

要做到這一點是一個真正的查詢,你的數據庫軟件將是相關的,因爲它需要在SQL中的字符串解析功能。 – jordanm

+0

@jordanm :-(這是sqlite3,但直到需要mysql纔是臨時措施。 – Oddthinking

回答

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)) 

更妙的是使用sqlalchemyHybrid Attributes,這樣就可以同時獲得蟒級別和數據庫的日期時間字段:

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級別上,它仍然是一個字符串。

+0

謝謝。這真棒,我需要了解混合屬性,它們聽起來非常有用。 – Oddthinking

相關問題