Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-00936 Lors de l'utilisation de la fonction de date dans l'instruction oracle select

Si vous voulez le the_date champ comme une date réelle :

select trunc(date '1970-01-01' + datetimeorigination / (24*60*60)) as the_date,
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'HH24') as the_hour,
  count(record_id)
from table_a
group by trunc(date '1970-01-01' + datetimeorigination / (24*60*60)),
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60), 'HH24');

THE_DATE  THE_HOUR COUNT(RECORD_ID)
--------- -------- ----------------
24-SEP-13 14                      1 
20-SEP-13 18                      1 

Si vous voulez que la valeur de l'heure soit un nombre, vous pouvez envelopper ce champ dans un to_number() appel. S'il s'agit d'un affichage, vous devez également formater explicitement la date :

select to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD') as the_date,
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'HH24') as the_hour,
  count(record_id)
from table_a
group by to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD'),
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60), 'HH24');

THE_DATE   THE_HOUR COUNT(RECORD_ID)
---------- -------- ----------------
2013-09-24 14                      1 
2013-09-20 18                      1 

Ou avec un champ pour la date et l'heure ensemble :

select to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD HH24') as the_hour,
  count(record_id)
from table_a
group by to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD HH24');

THE_HOUR      COUNT(RECORD_ID)
------------- ----------------
2013-09-24 14                1 
2013-09-20 18                1 

Cela dépend de ce que vous voulez voir et de ce que vous allez en faire.

Quels que soient les champs que vous utilisez pour l'agrégation, vous devez les spécifier de la même manière dans le group by clause - vous ne pouvez pas utiliser la notation positionnelle, par ex. group by 1, 2 . ET vous avez déjà réalisé que le between les valeurs doivent être dans l'ordre croissant ou il ne trouvera rien du tout.