【问题标题】:Comparing with date in Oracle sql与Oracle sql中的日期比较
【发布时间】:2013-04-04 22:00:21
【问题描述】:

我有一个 'creation_date' 类型的列 'date',当我根据 'creation_date' 查询我的表以获取不同的记录时,我得到 6 条记录:

select distinct creation_date from test_table;

输出:

06-APR-11
06-APR-11
28-MAR-11
06-APR-11
06-APR-11
18-MAR-11

在此输出中,即使我在查询中使用 distinct,4 月 6 日也会显示 4 次。此外,当我试图找出与creation_date6th April 2011 匹配的所有记录时,我没有得到任何结果。以下是我的查询:

select * from  test_table where creation_date = to_date('06-APR-11','DD-MON-YY');

请帮助我在这两个查询中哪里做错了。

【问题讨论】:

  • @chaithanya:大部分数据库都使用时间戳,所以看看它会对你有所帮助。

标签: sql oracle date


【解决方案1】:

问题是双重的。首先,日期几乎肯定有时间成分。 to_date('06-MAR-11','DD-MON-YY') 等价于 2011/03/06 00:00:00。如果您使用TRUNC() 功能,您将能够看到当天的所有内容:

select * 
  from test_table
 where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');

不会使用 MON datetime format model。正如我解释的here 这取决于您的地区和设置。使用数字月份格式模型更安全。同样,始终将世纪指定为年份的一部分。

where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');

你的第二个问题几乎肯定是你的NLS_DATE_FORMAT;它似乎没有考虑时间,因此为什么您会看到 4 个相同的日期。这仅控制数据显示的方式,而不是它的存储方式。

您可以使用以下方式更改此设置:

ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"

如果我使用以下设置测试环境:

create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";

您可以看到返回的数据不包含时间(虽然 SYSDATE 包含):

SQL> select * from test_table;

CREATION_D
----------
2013/04/12
2013/04/12

更改 NLS_DATE_FORMAT 并执行相同的 SELECT,您现在得到一个时间组件:

SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";

Session altered.

SQL> select * from test_table;

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

最后,当尝试单独选择今天的日期时,不会返回任何行:

SQL> select *
  2    from test_table
  3   where creation_date = to_date('20130412','yyyymmdd');

no rows selected

但是,当使用 TRUNC() 仅比较字段的日期部分时,您会再次获得所有行:

SQL> select *
  2    from test_table
  3   where trunc(creation_date) = to_date('20130412','yyyymmdd');

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

要真正回答您的第二个问题,如果您想要唯一的日期,您可以重复使用 TRUNC() 函数:

select distinct trunc(creation_date)
  from test_table

【讨论】:

    【解决方案2】:

    DATE 数据类型存储年(包括世纪)、月、日、小时、分钟和秒(午夜之后)。您还必须考虑这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2012-04-28
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多