Oracle to_date SQL格式问题,

时间:2015-05-19 17:10:26

标签: sql oracle date-arithmetic

我将时间戳字段格式化为'DD / MM / YYYY'格式,以获取该日期的所有已处理记录。

select count(*) from task_log where to_date (event_dt,'DD/MM/YYYY')= to_date('19/05/2015','DD/MM/YYYY');

以上查询返回0计数。

select count(*) from task_log where to_date (event_dt,'DD/MM/YYYY')= to_date('19/05/0015','DD/MM/YYYY');

以上查询返回29个计数。

如果我跑:

select event_dt from task_log where to_date (event_dt,'DD/MM/YYYY')= to_date('19/05/0015','DD/MM/YYYY');
EVENT_DT
5/19/2015 9:35:23 AM
5/19/2015 9:35:23 AM
5/19/2015 9:37:22 AM
5/19/2015 9:37:23 AM
5/19/2015 9:37:32 AM
5/19/2015 9:37:53 AM

依旧......

select to_date (event_dt,'DD/MM/YYYY') as to_date_Farmatted from task_log
TO_DATE_FARMATTED
5/19/0015
5/19/0015
5/19/0015
5/19/0015
5/19/0015

to_date格式是将年份格式化为 0015

如何避免将年份格式化为0015格式?我需要2015年的格式。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:8)

  

to_date(event_dt,'DD / MM / YYYY')

根据您对评论的回复,

  1. 您的数据库是 Oracle
  2. 您的event_date列的数据类型为 DATE
  3. 永远不要在 DATE 列上应用 TO_DATE 。它迫使Oracle:

    • 首先将其转换为字符串
    • 然后将其转换回日期

    基于区域设置特定的NLS设置。您需要 TO_DATE 才能将文字转换为日期。对于日期算术,请保留日期。

    您需要做的就是:

    select count(*)
       from task_log 
      where trunc(event_dt) = to_date('19/05/2015','DD/MM/YYYY');
    

    现在,捕捉是 TRUNC 功能。请记住,DATE具有datetime元素。因此,在比较两个日期时,您必须牢记时间部分。

    应用 TRUNC 会抑制任何常规索引用法。最好使用日期范围条件。

    例如,

    select count(*)
       from task_log 
      where event_date 
     between to_date('19/05/2015','DD/MM/YYYY')
        and to_date('19/05/2015','DD/MM/YYYY') + 1;