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

发布于 2024-08-13 21:01:27 字数 422 浏览 9 评论 0 原文

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

I am using Perl's DBD::ODBC to connect to an Oracle database. However, an issue arises when I try to execute a select query using a date in the where clause. It seems this issue occurs because of the database's date format being DD-MON-RR (see DBD::ODBC::FAQ). Since I cannot change the database's settings, can anyone suggest a workaround?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

落叶缤纷 2024-08-20 21:01:27

数据库的默认日期格式仅在您依赖它时才重要,但通常情况下您不应该依赖它。您可以:

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';

The database's default date format only matters if you depend on it, which you should not in general. You can:

1) Specify the format of the date in your query:

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

2) Use the ANSI standard for date literals:

select *
from news
where news_date = DATE '2009-12-01';
剩一世无双 2024-08-20 21:01:27

一种选择是使用 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

One option is to use the TO_DATE() function (or the ANSI 'DATE' keyword) to convert the format in every query:

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

If you have to do this a lot, a better option would be to set the format for the session:

$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'");

Then:

my $sth = $dbh->prepare(<<EOT);
SELECT date_field
FROM some_table
WHERE date_field > '2009-11-01'
EOT
思念绕指尖 2024-08-20 21:01:27

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

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

Don't rely on implicit datatype conversion. You can always specify the date format in the where clause:

WHERE your_column = to_date(:your_parameter, 'yyyy/mm/dd')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文