Python — cx_Oracle — возвращает ORA-01847: день месяца должен быть между 1 и последним днем месяца

#python #cx-oracle

#python #cx-oracle

Вопрос:

Я пытаюсь подключиться к базе данных Oracle с помощью модуля python cx_Oracle. Когда я пытаюсь выполнить определенный запрос, я получаю ‘ORA-01847: день месяца должен быть между 1 и последним днем месяца’

Запрос:

 select  case when to_date (STOP_DATE, 'dd-mon-yy')='01-JAN-01' then '000000' else  to_char(to_date(STOP_DATE,'dd-mon-yy'),'mmddyy') end STOP_DATE
                        from table1 where SYS_1= 1234 and rownum < 11
  

Тот же запрос отлично работает в SQLDeveloper.

Любая помощь высоко ценится.

Код Python:

 import cx_Oracle
connection = None
try:
    dsn_tns = cx_Oracle.makedsn("host", "port", service_name="serviceName")
    connection = cx_Oracle.connect(user="user", password="password", dsn=dsn_tns)
    c = connection.cursor()
    sqlStatement = r'''
                            select  case when to_date (STOP_DATE, 'dd-mon-yy')='01-JAN-01' then '000000' else  to_char(to_date(STOP_DATE,'dd-mon-yy'),'mmddyy') end STOP_DATE
                            from table1 where SYS_1= 1234 and rownum < 11

    '''
    c.execute(sqlStatement)
    resultSet = c.fetchall()
    if not len(resultSet) == 0:
            print("query successful!!!!!!!!!!")
            for row in resultSet:
                for items in row:
                   if items == None:
                      items = ""
                print (items)

    if connection:
        print('all executed')
        connection.close()

except Exception as e:
        print(e)
        if connection:
           connection.close()
  

Комментарии:

1. Я полагаю, STOP_DATE — это символьный столбец? Есть ли причина, по которой вы сохраняете STOP_DATE как столбец символов, а не дату? Это устранило бы проблемы, с которыми вы сталкиваетесь! Возможно, вы захотите выбрать только одну строку (одну и ту же в обоих случаях), чтобы убедиться, что вы не просто столкнулись с проблемой данных!

2. привет @AnthonyTuininga, STOP_DATE — это столбец даты, но он в другом формате. (гггг-мм-дд ЧЧ: ММ: СС)

3. Если STOP_DATE — это столбец даты, то вместо этого вы должны сделать это: stop_date = to_date(’01-JAN-01′, ‘dd-MON-YY’)