Oracle日期格式的Perl DBD :: ODBC问题

时间:2009-12-08 15:18:29

标签: perl oracle datetime odbc dbd

我使用Perl的DBD::ODBC连接到Oracle数据库。但是,当我尝试使用where子句中的日期执行选择查询时,会出现问题。似乎出现此问题是因为数据库的日期格式为DD-MON-RR(请参阅DBD::ODBC::FAQ)。由于我无法更改数据库的设置,任何人都可以建议解决方法吗?

3 个答案:

答案 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')