2016-05-27 7 views
0
class Journal(Base): 
    __tablename__ = '_1SJOURN' 
    rid = Column("ROW_ID", Integer, primary_key=True) 
    journal_id = Column("IDJOURNAL", Integer) 
    iddoc = Column("IDDOC", String) 
    iddocdef = Column("IDDOCDEF", Integer) 
    datetime = Column("DATE_TIME_IDDOC", String) 

テーブルのフィールドDATE_TIME_IDDOCは、200809305DU3F4 65Pのように、最初の8文字は日付です。 s = 20070503、e = 20090503の日付の行を選択する必要があります。 私が試した:まずsqlalchemy混合フィールドを現在までキャストする方法は?

filter(
    and_(func.convert(sql.literal_column('DATE'), Journal.datetime, sql.literal_column('1,8')) > s, 
     func.convert(sql.literal_column('DATE'), Journal.datetime, sql.literal_column('1,8')) < e)) 

答えて

0

を、次の2つの列に、「日時」列を分割することができない理由:日時及び「other_info」?あなたのテーブルの構造は最適化されていません。下のように表示されたら、あなたが望むものを実装するのがより簡単になります。簡単で正しい。

class Journal(Base): 
    __tablename__ = '_1SJOURN' 
    rid = Column("ROW_ID", Integer, primary_key=True) 
    journal_id = Column("IDJOURNAL", Integer) 
    iddoc = Column("IDDOC", String) 
    iddocdef = Column("IDDOCDEF", Integer) 
    datetime = Column("DATE_TIME", DateTime) 
    other = Column("OTHER", String) 

# here I do not use `and_`, because it used by default 
Session.query(Journal).filter(Journal.datetime > s, Journal.datetime < e) 

しかし、本当にそれが必要な場合は、それがあなたのクエリです。生SQL(PostgreSQL用、他のDBMSは、同じ機能を持っていますが、別の名前で):

SELECT * FROM journal WHERE to_timestamp(left(DATE_TIME_IDDOC, 8), 'YYYYMMDD') > '2008-10-01' AND to_timestamp(left(DATE_TIME_IDDOC, 8), 'YYYYMMDD') < '2010-01-20'; 

SQLAlchemyのクエリ:

filter_col = func.to_timestamp(func.left(Journal.datetime, 8), 'YYYYMMDD') 
Session.query(Journal).filter(filter_col > s, filter_col < e) 
0
and_(func.convert(sql.literal_column('datetime'),func.substring(Journal.datetime, 1,8)) > s , 
      func.convert(sql.literal_column('datetime'), func.substring(Journal.datetime, 1, 8)) < e)).filter(
関連する問題