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')
3 Réponses :
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
Je pense que tu as oublié le de. et oui j'ai besoin du zéro
Donne également une erreur `Date Format de la date des extrémités avant de convertir une chaîne d'entrée complète` pointant sur` date_time`
Pour obtenir une plage de dates, vous avez besoin: SQLFIDDLE.com/#!4/9CD56/8 a> - probablement quelqu'un va suggérer une voie plus efficace
Ok, j'ai changé la réponse à un exemple testé maintenant, je pense que cela fait ce que vous voulez. "TO_Date" ne fonctionne pas sur des horodatages comme vous et que j'ai deviné, mais vous pouvez tronquer la date, puis le formater dans une chaîne lisible / groupable avec 'to_char'. Si vous allez utiliser cette requête, un raffinement supplémentaire possible, vous pourriez simplement taper les dates en une fois; Ou si vous voulez qu'il soit toujours de dire il y a 10 jours jusqu'à ce que ce soit aujourd'hui, cela devrait également être possible.
Mon dernier problème est la date_time qu'il s'agit d'un Varchar, im druisser avec la conversion. Sélectionnez UserID, Nom d'utilisateur, Nom de libre, Date_Time, LogType, Résultat, Remarques de Tblaccesslogs Où TO_Date (date_time, 'AAAYY-MM-DD')> = TO_Date ('2020-01-01', 'AAAAYY-MM-DD ') Et to_date (date_time,' yyyy-mm-dd ') <= to_date (' 2020-01-01 ',' yyyy-mm-dd ') code>
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;
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
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?