我使用Perl的DBD::ODBC连接到Oracle数据库。但是,当我尝试使用where子句中的日期执行选择查询时,会出现问题。似乎出现此问题是因为数据库的日期格式为DD-MON-RR(请参阅DBD::ODBC::FAQ)。由于我无法更改数据库的设置,任何人都可以建议解决方法吗?
答案 0 :(得分: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 :(得分: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
答案 2 :(得分:1)
不要依赖隐式数据类型转换。您始终可以在where子句中指定日期格式:
WHERE your_column = to_date(:your_parameter, 'yyyy/mm/dd')