2016-05-27 12 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) 

Tabelle hat Feld DATE_TIME_IDDOC wie 200809305DU3F4 65P, erste 8 Zeichen ist Datum. Ich muss Zeilen mit Datum zwischen s = 20070503, e = 20090503 auswählen. Ich habe versucht:sqlalchemy Wie man bis jetzt gemischtes Feld wirft?

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

Antwort

0

Zunächst warum können Sie nicht geteilt „Datetime“ Spalte zwei Spalten: Datetime und „other_info“? Die Struktur Ihres Tisches ist nicht optimiert. Wenn es wie folgt aussieht, ist es einfacher zu implementieren, was Sie wollen. Einfacher und zu Recht.

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) 

Aber, wenn Sie es wirklich wollen, das ist Ihre Abfrage. Raw SQL (für PostgreSQL, andere DBMSes haben die gleichen Funktionen, aber mit einem anderen Namen):

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 query:

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(