我正在尝试编写此查询以检索按日期分组的记录数:
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
出了什么问题......
答案 0 :(得分:7)
与documented一样,DATE数据类型是一个日期时间,因此除了您在具有此名称的数据类型中更合理地期望的属性之外,还存储小时,分钟和秒。如果您想要计算一天,您需要删除日期的时间部分。这是TRUNC()
的默认行为,因此要做到这一点trunc(<date>)
就是您所需要的。
此时值得注意两件事:
我假设system_date
是您表格中的一栏,而不是对SYSDATE的误解
您的介于子句之间是完全错误的,危险的。
顺便提一下您的日期,似乎您的NLS_DATE_FORMAT是DD-MON-YYYY(有关详细信息,请参阅another answer of mine)。这意味着当您将日期隐式转换为字符时,它将以此格式转换。
您没有使用您要比较的datetime literal或explicit conversion个值,这意味着您的日期会被隐式转换为字符。但是,当你进行比较时,你会发现事情并不像看起来那样。字符比较通常是二进制的;这意味着二月的10 th 不在1月的10 和3月的10 th 之间; “三月”小于“一月”。
始终显式转换日期,始终在进行日期比较时使用日期。
将所有这些放在一起成为您的查询:
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)
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