2017-07-19 70 views
0

我想将此查询的结果分配给变量,并将该变量用作另一个SQL查询中的宏变量。将SQL查询结果分配给Python中的宏变量

第一次查询:

start_week = 201619 

start_date=connection.execute(""" 
select min(CAST(date_id as DATE)) as start_date from date_table 
where CAST(week_id as INT) = %d 
""" 
%(start_week)) 

start_date = start_date.fetchone() 

此查询的结果是:(datetime.datetime(2017年,7,2,0,0))

第二查询:现在我想用这是第二个查询宏变量

start_wk=connection.execute(""" 
select fis_week_id as start_wk from date_dim 
where date_id = %s 
""" 
%(start_date)) 

不过,我得到一个错误,如:

DatabaseError: (cx_Oracle.DatabaseError) ORA-00936: missing expression 
[SQL: '\nselect week_id as start_wk from date_dim\nwhere date_id = (datetime.datetime(2016, 7, 4, 0, 0),)\n'] 

如果有人告诉我如何做到这一点,我将不胜感激。

谢谢!

回答

0

只需字符串将日期时间格式化为字符串格式:'YYYY-M-D'其中RDBMS将其读取为日期时间。此外,将该日期作为参数传递,不插入到SQL字符串中。见Oracle+Python最佳实践:

str_start_date = datetime.datetime.strftime(start_date[0], '%Y-%m-%d') 

cur = connection.cursor() 

start_wk = cur.execute(""" 
    select fis_week_id as start_wk 
    from date_dim 
    where date_id = to_date(:sdate, 'yyyy-mm-dd')""", {'sdate':str_start_date}) 

cur.close() 

然而,考虑而不需要中间变量,其中第一个查询成为第二个查询的WHERE子句中的子查询的两种查询相结合:

cur = connection.cursor() 

start_wk = cur.execute(""" 
    select fis_week_id as start_wk 
    from date_dim 
    where date_id = (select min(CAST(date_id as DATE)) as start_date 
        from date_table 
        where CAST(week_id as INT) = :sweek)""", {'sweek':start_week}) 
cur.close() 
+0

你想说些什么呢?请发布错误(通常是回溯的最后一行)而不是代码。为什么你不使用游标对象来执行'execute()'? – Parfait

+0

hi-当我运行第一个查询,我得到这个错误:DatabaseError:(cx_Oracle.DatabaseError)ORA-01861:文字不匹配格式字符串 [SQL:'\ n从date_dim选择fis_week_id作为start_wk \ n \ n date_id =:sdate'] [参数:{'sdate':'2016-07-04'}] –

+0

查看更新。对于Oracle,你需要用'to_date()'来包装日期时间字符串。 – Parfait

相关问题