0

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

4

3 回答 3

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';
于 2009-12-08T15:22:07.590 回答
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
于 2009-12-08T16:36:15.923 回答
1

不要依赖隐式数据类型转换。您始终可以在 where 子句中指定日期格式:

WHERE your_column = to_date(:your_parameter, 'yyyy/mm/dd')
于 2009-12-08T15:22:26.403 回答