2009-12-08 3 views
0

Я использую Perl DBD::ODBC для подключения к базе данных Oracle. Однако возникает проблема, когда я пытаюсь выполнить запрос выбора, используя дату в предложении where. Похоже, эта проблема возникает из-за того, что формат даты базы данных является DD-MON-RR (см. DBD::ODBC::FAQ). Поскольку я не могу изменить настройки базы данных, может ли кто-нибудь предложить обходной путь?Perl DBD :: Проблемы ODBC с форматами дат Oracle

ответ

4

Формат даты по умолчанию по умолчанию имеет значение только в том случае, если вы зависите от него, чего вы не должны в целом. Вы можете:

1) Укажите формат даты в запросе:

select * 
from news 
where news_date = to_date ('01-DEC-2009','DD-MON-RRRR'); 

2) Используйте стандарт ANSI для дат литералов:

select * 
from news 
where news_date = DATE '2009-12-01'; 
1

Не полагайтесь на неявное тип данных преобразование. Вы всегда можете указать формат даты в предложении, где:

WHERE your_column = to_date(:your_parameter, 'yyyy/mm/dd') 
2

Одним из вариантов является использование TO_DATE() функцию (или ANSI «DATE» ключевое слово), чтобы преобразовать формат в каждом запросе:

WHERE date_field > TO_DATE('2009-11-01', 'YYYY-MM-DD'); 
-- or 
WHERE date_field > DATE '2009-11-01' 

Если вам нужно сделать, это много, лучшим вариантом было бы установить формат для сессии:

$dbh->do("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); 
$dbh->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SSxFF'"); 
$dbh->do("ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SSxFF'"); 

Тогда:

my $sth = $dbh->prepare(<<EOT); 
SELECT date_field 
FROM some_table 
WHERE date_field > '2009-11-01' 
EOT 
Смежные вопросы