sql - 奇怪的 Oracle 日期行为

标签 sql oracle

我在我们的一个生产数据库中遇到了一个奇怪的问题。长话短说,简单的查询:

select id, trunc(stdate) from table_name where trunc(stdate) = '05-FEB-09';  

未返回任何行。然而,

select trunc(stdate) from table_name where id = sought_after_id;

返回 '05-FEB-09'。只有在我尝试之后:

update table_name set stdate = '05-FEB-09' where id = sought_after_id;

我的原始查询按预期工作:

select id, trunc(stdate) from table_name where trunc(stdate) = '05-FEB-09';
> sought_after_id, '05-FEB-09'

那么,我的 stdate 值发生了什么?

最佳答案

您应该始终将日期与日期进行比较(苹果对苹果...),而不是依赖隐式转换。

由于 TRUNC(date) 返回一个日期,您应该将它与一个日期进行比较:

select id, trunc(stdate) from table_name where trunc(stdate) = DATE '2009-02-05'

select id, trunc(stdate) 
  from table_name 
 where trunc(stdate) = TO_DATE('05-FEB-09', 'DD-MON-RR'))

更新 回应 Igor 的第一条评论:

依赖隐式数据转换使得查询结果依赖于多个 session 参数。如果您现在看到的结果与前几天不同,则其中一个参数一定已被修改。您可以通过不依赖隐式转换使您的查询“与 session 无关”。

值得坚持的是,您的第一个查询取决于客户端 session 的参数。如果 session 修改其默认日期显示设置 NLS_DATE_FORMAT,您的查询将不会返回相同的结果。

相关说明,DD-MON-RR 是一种完全可以接受的显示 日期格式,但它不太适合在您的代码中使用,因为关于世纪有歧义,并且您依赖于月份的 NLS_DATE_LANGUAGE 参数。

关于sql - 奇怪的 Oracle 日期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2132631/

相关文章:

sql - 如何在 Bash 脚本中运行 SQL 命令并将该命令的输出保存到变量

php - 使用 CodeIgniter 将数组数据插入到两个表中

mysql - 在 MySQL 中工作的 SQL 语句在 Postgresql 中不起作用 - Sum 和 group by Rails 3

php - 使用 php 显式向 sql 值添加逗号

mysql - postgresql 分组依据

mysql - 如何在 MySQL 中创建数据库链接以连接到 Oracle?

php - mysql - 如何从选定的行中选择倾斜行

java - 无法解析 oracle.jdbc.OracleDriver

sql - 按 desc 排序顺序未按预期工作

oracle - Oracle 数据库管理员 Docker