使用sql查询与按日期分组

时间:2013-11-24 06:19:17

标签: sql oracle date select group-by

我正在尝试编写此查询以检索按日期分组的记录数:

SELECT system_date,count (is_paid)
  FROM TPWEB.TP_CLIENT_TENDER_TRANS
  where system_date between '1-DEC-12' and '31-DEC-12'
  group by system_date

但是,我得到了没有分组的结果,如:

01-DEC-12   1
01-DEC-12   1
01-DEC-12   1
01-DEC-12   1

出了什么问题......

4 个答案:

答案 0 :(得分:7)

documented一样,DATE数据类型是一个日期时间,因此除了您在具有此名称的数据类型中更合理地期望的属性之外,还存储小时,分钟和秒。如果您想要计算一天,您需要删除日期的时间部分。这是TRUNC()的默认行为,因此要做到这一点trunc(<date>)就是您所需要的。

此时值得注意两件事:

  1. 我假设system_date是您表格中的一栏,而不是对SYSDATE的误解

  2. 您的介于子句之间是完全错误的,危险的。

    顺便提一下您的日期,似乎您的NLS_DATE_FORMAT是DD-MON-YYYY(有关详细信息,请参阅another answer of mine)。这意味着当您将日期隐式转换为字符时,它将以此格式转换。

    您没有使用您要比较的datetime literalexplicit conversion个值,这意味着您的日期会被隐式转换为字符。但是,当你进行比较时,你会发现事情并不像看起来那样。字符比较通常是二进制的;这意味着二月的10 th 不在1月的10 和3月的10 th 之间; “三月”小于“一月”。

    始终显式转换日期,始终在进行日期比较时使用日期。

  3. 将所有这些放在一起成为您的查询:

    select trunc(system_date), count(is_paid)`
      from TPWEB.TP_CLIENT_TENDER_TRANS
     where system_date between date '2012-12-01' and date '2012-12-31'
     group by trunc(system_date)
    

答案 1 :(得分:1)

Oracle中的

DATE列包含精度高达毫秒,而不仅仅是日期。如果您只对日期本身感兴趣,则应TRUNC删除小时,分钟等:

SELECT   system_date,COUNT (is_paid)
FROM     TPWEB.TP_CLIENT_TENDER_TRANS
WHERE    system_date BETWEEN '1-DEC-12' AND '31-DEC-12'
GROUP BY TRUNC(system_date, 'DD-MON-YY')

答案 2 :(得分:1)

使用trunc函数,DATE数据类型保留了它的时间,因此使用trunc我们可以截断时间。以下查询有效!

SELECT trunc(system_date),count (is_paid)
  FROM TPWEB.TP_CLIENT_TENDER_TRANS
  where system_date between '1-DEC-12' and '31-DEC-12'
  group by trunc(system_date);

答案 3 :(得分:-1)

这对我有用:

select DT_FECHA_DESDE,DT_FECHA_HASTA
from (SELECT TRUNC(DT_FECHA_DESDE)as DT_FECHA_DESDE,TRUNC(DT_FECHA_HASTA) as DT_FECHA_HASTA
FROM TBL1
WHERE run='3456'
order by DT_FECHA_DESDE)  
group by DT_FECHA_DESDE,DT_FECHA_HASTA