【问题标题】:How to compare different format date in oracle?如何在oracle中比较不同格式的日期?
【发布时间】:2021-10-07 02:39:48
【问题描述】:

我有一个使用日期的表,需要在特定日期之间返回行。

列名是tg_konfi,列格式是DATE,tg_konfi日期是02-FEB-21这样。

我试过了

SELECT * From table where to_date(tg_konfi,'DD-MON-YY') between to_date('2021-01-01','YYYY-MM-DD') and to_date('2021-10-07','YYYY-MM-DD');

它什么也没返回。是我遗漏了什么,还是我做错了?

【问题讨论】:

  • tg_konfi 是否定义为 DATE 列?如果是这样,您不需要使用 to_date。
  • 是的,它仍然没有返回任何东西
  • 没有必要对已经是 DATE 的值调用 TO_DATE02-FEB-21 只是根据NLS_DATE_FORMAT session 参数的默认显示格式。

标签: oracle date datetime


【解决方案1】:

由于tg_confi 是一个日期数据类型列,因此不要在该列上使用to_date

使用以下查询:

SELECT * 
  From table 
 where tg_konfi between to_date('2021-01-01','YYYY-MM-DD') 
                    and to_date('2021-10-07','YYYY-MM-DD');

【讨论】:

    【解决方案2】:

    日期没有格式 - 它是 stored internally to the database 为 7 字节(代表世纪、世纪、月、日、小时、分钟和秒),直到您使用任何用户界面using(即 SQL/Plus、SQL Developer、Java 等)尝试将其显示给您,即用户,即将其转换为您认为有意义的内容(通常是字符串),日期具有格式(并且转换由用户界面完成,而不是由数据库完成)。

    如果您的值都是 DATE 数据类型,那么这意味着您无需担心任何格式 - 因为它们在数据库中没有格式。

    最简单的方法是使用日期文字:

    SELECT *
    FROM   table
    WHERE  tg_konfi BETWEEN DATE '2021-01-01'
                        AND DATE '2021-10-07';
    

    或使用TO_DATE从字符串文字显式转换:

    SELECT *
    FROM   table
    WHERE  tg_konfi BETWEEN TO_DATE( '2021-01-01', 'YYYY-MM-DD' )
                        AND TO_DATE( '2021-10-07', 'YYYY-MM-DD' );
    

    这将获取tg_konfi 介于2021-01-01T00:00:002021-10-07T00:00:00 之间的所有行。

    如果您希望范围最多包含2021-10-07T23:59:59,那么您可以使用:

    SELECT *
    FROM   table
    WHERE  tg_konfi >= DATE '2021-01-01'
    AND    tg_konfi <  DATE '2021-10-07' + INTERVAL '1' DAY; -- or DATE '2021-10-08'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2019-03-09
      相关资源
      最近更新 更多