0
votes

Compter les données par jour entre deux dates

Bonjour, j'essaie de compter la remarque tardif totale par jour entre deux dates entrées de l'utilisateur.

Par exemple: P>

Select Count(REMARKS) countBT from TBLACCESSLOGS WHERE To_date(DATE_TIME,'YYYY-MM-DD') between To_date('2020-02-18','YYYY-MM-DD') and To_date('2020-02-20','YYYY-MM-DD')


2 commentaires

Pourquoi stockez-vous des dates dans une chaîne?


C'est juste une table existante et je ne suis pas qui fait la table. Comment puis-je obtenir les entre-deux dans la date de Twi Varcharner?


3 Réponses :


1
votes

complètement édité; Il s'agit d'un processus en plusieurs étapes, la véritable logique SQL importante est dans "the_goods". La génération de jours est en "jours" et j'ai pris cela à partir de là: https://www.zetic.net/blog/2009/2/12/generating-acheté-Date-Series-in-oracle.html - - Je ne comprends pas beaucoup plus que ctl-c / ctl-v. "Perms" fait la permutation des dates / noms, puis qui est laissée à gauche à la_goods pour obtenir les comptes. Donc, pour chaque combo de l'utilisateur et des dates dans la plage, vous obtenez une ligne, et le comptage de the_goods, ou zéro s'il n'y a pas de ligne de correspondance.

Fiddle avec elle: http://sqlfiddle.com/#!4/42618/8 P>

 WITH DAYS AS 
 (SELECT TO_CHAR(TRUNC(TO_DATE('01-JAN-2020') + ROWNUM - 1, 'DD'), 'YYYY-MM-DD') AS ADAY
 FROM (
   SELECT ROWNUM FROM (
 SELECT 1 FROM DUAL
 CONNECT BY LEVEL <= (TO_DATE('08-JAN-2020') - TO_DATE('01-JAN-2020'))
   )
 )
 ),
 THE_GOODS AS (
   select name, to_char(DATE_TIME, 'YYYY-MM-DD') AS ADAY, count(*) AS HOW_MANY
 from TBLACCESSLOGS
 where trunc(DATE_TIME, 'DD') between to_date('2020-01-01', 'YYYY-MM-DD')
 and to_date('2020-01-05', 'YYYY-MM-DD')
 and remarks = 'LATE'
 group by name, to_char(DATE_TIME, 'YYYY-MM-DD')
   )
 ,
 PERMS AS (
 SELECT DISTINCT DAYS.ADAY,  THE_GOODS.NAME
 FROM DAYS 
   CROSS JOIN
   THE_GOODS
  )
   SELECT p.NAME, p.ADAY, COALESCE(g.HOW_MANY, 0) AS HOWMANY
   FROM PERMS p
   LEFT JOIN THE_GOODS g
 on p.ADAY = g.ADAY
 and p.NAME = g.NAME
   ORDER BY p.ADAY, g.NAME



3
votes

Puisque vous êtes confronté à la perspective qu'il peut y avoir des dates manquantes dans la plage de votre recherche, vous devez générer une entrée pour chaque date de cette gamme. Vous rejoignez ces dates avec votre table en comptant le nombre de remarques colonne.

with date_parms as 
     (select to_date('&Start_Date','yyyy-mm-dd') start_date 
           , to_date('&End_Date','yyyy-mm-dd') end_date
        from dual
     ) 
    , date_list as
      (select start_date+lev-1 t_date 
         from date_parms
            , ( select level lev 
                  from dual 
                connect by level <= (select end_date - start_date + 1   
                                       from date_parms
                                    )
               ) 
       )  
select t_date "Date"
     , name
     , count(*) "Num Late"
  from date_list  dl
  left join lates l  on trunc(l.date_time) = dl.t_date and lower(l.remark) = 'late' 
 where 1=1 --lower(l.remark) = 'late'
 group by trunc(t_time), name; 


0 commentaires

0
votes

Essayez ceci ..

    SQL> select * from late_remarks;

        ID NAME DATE_TIME             REMARKS
        -- --   -------------------   ----
        1  Aa   2020-01-18 09:57:56   LATE
        2  Aa   2020-01-18 10:57:56   LATE
        3  Aa   2020-01-19 06:52:56
        4  Aa   2020-01-19 09:57:56   LATE
        5  Aa   2020-01-19 09:57:56   LATE
        6  Aa   2020-01-21 09:57:56   LATE

    6 rows selected.



    SQL> with dates as (
      2      select to_date('17-01-2020', 'DD-MM-YYYY') + level "DATE"
      3      from dual
      4      connect by level <= (to_date('21-01-2020', 'DD-MM-YYYY') - to_date('17-01-2020', 'DD-MM-YYYY'))
      5      )
      6  select 'Aa' name, d."DATE", count(lr.remarks) count from dates d
      7      left outer join late_remarks lr
      8          on d."DATE" = trunc(to_timestamp (lr.date_time, 'YYYY-MM-DD HH24:MI:SS'))
      9      group by d."DATE"
     10      order by d."DATE";

    NAME DATE           COUNT
    --   --------- ----------
    Aa   18-JAN-20          2
    Aa   19-JAN-20          2
    Aa   20-JAN-20          0
    Aa   21-JAN-20          1


0 commentaires