2009-06-17 8 views
1

Je dois déterminer combien d'instances différentes se produisent un jour différent, à partir de plusieurs plages différentes. Probablement le mieux pour l'expliquer avec un exemple.Utilisation des plages de dates dans PHP/Oracle

18-JAN-09 to 21-JAN-09 
19-JAN09 to 20-JAN-09 
20-JAN-09 to 20-JAN-09 

En utilisant les trois exemples ci-dessus, j'ai besoin pour recueillir ces informations et afficher quelque chose d'un peu comme ...

18th Jan: 1 
19th Jan: 2 
20th Jan: 3 
21st Jan: 1 

... Je serai les informations de détourner une base de données Oracle fwiw (d'où le format ci-dessus ^) et il y aura des centaines, peut-être des milliers d'enregistrements, donc mon boiteux tente de faire toutes sortes de boucles et si les instructions prendraient une éternité à s'exécuter.

Existe-t-il un moyen assez simple et efficace de le faire? Je ne suis vraiment pas trop sûr où commencer ... malheureusement

Merci

Répondre

1

Soit votre moteur DB ou votre code PHP va avoir à boucler sur la plage de dates.

Voici du code PHP pour faire la sommation. Le nombre de jours est stocké par year-month pour éviter d'avoir un grand tableau pour une plage de dates étendue.

<?php 

// Get the date ranges from the database, hardcoded for example 
$dateRanges[0][0] = mktime(0, 0, 0, 1, 18, 2009); 
$dateRanges[0][1] = mktime(0, 0, 0, 1, 21, 2009); 
$dateRanges[1][0] = mktime(0, 0, 0, 1, 19, 2009); 
$dateRanges[1][1] = mktime(0, 0, 0, 1, 20, 2009); 
$dateRanges[2][0] = mktime(0, 0, 0, 1, 20, 2009); 
$dateRanges[2][1] = mktime(0, 0, 0, 1, 20, 2009); 

for ($rangeIndex = 0; $rangeIndex < sizeof($dateRanges); $rangeIndex++) 
{ 
    $startDate = $dateRanges[$rangeIndex][0]; 
    $endDate = $dateRanges[$rangeIndex][1]; 

    // Add 60 x 60 x 24 = 86400 seconds for each day 
    for ($thisDate = $startDate; $thisDate <= $endDate; $thisDate += 86400) 
    { 
    $yearMonth = date("Y-m", $thisDate); 
    $day = date("d", $thisDate); 

    // Store the count by year-month, then by day 
    $months[$yearMonth][$day]++; 
    } 
} 

foreach ($months as $yearMonth => $dayCounts) 
{ 
    foreach ($dayCounts as $dayNumber => $dayCount) 
    { 
    echo $yearMonth . "-" . $dayNumber . ": " . $dayCount . "<br>"; 
    } 
} 

?> 
2

Vous pouvez utiliser la méthode décrite dans another SO:

SQL> WITH DATA AS (
    2 SELECT to_date('18-JAN-09', 'dd-mon-rr') begin_date, 
    3   to_date('21-JAN-09', 'dd-mon-rr') end_date FROM dual UNION ALL 
    4 SELECT to_date('19-JAN-09', 'dd-mon-rr'), 
    5   to_date('20-JAN-09', 'dd-mon-rr') FROM dual UNION ALL 
    6 SELECT to_date('20-JAN-09', 'dd-mon-rr'), 
    7   to_date('20-JAN-09', 'dd-mon-rr') FROM dual 
    8 ),calendar AS (
    9 SELECT to_date(:begin_date, 'dd-mon-rr') + ROWNUM - 1 c_date 
10 FROM dual 
11 CONNECT BY LEVEL <= to_date(:end_date, 'dd-mon-rr') 
12      - to_date(:begin_date, 'dd-mon-rr') + 1 
13 ) 
14 SELECT c.c_date, COUNT(d.begin_date) 
15 FROM calendar c 
16 LEFT JOIN DATA d ON c.c_date BETWEEN d.begin_date AND d.end_date 
17 GROUP BY c.c_date 
18 ORDER BY c.c_date; 

C_DATE  COUNT(D.BEGIN_DATE) 
----------- ------------------- 
18/01/2009     1 
19/01/2009     2 
20/01/2009     3 
21/01/2009     1 
+0

Merci beaucoup Vincent - qui a l'air parfait! Une question cependant, y at-il de toute façon à remplir automatiquement la date? Ça va durer des années, donc j'ai besoin presque de faire défiler et afficher chaque date, ou quelque chose ... :( Merci – Nick

+0

Salut Nick, vous remplissez la sous-requête "calendrier" en entrant des valeurs pour les variables ": begin_date "et": end_date " –

1

Vous avez besoin d'une table avec une ligne pour chaque jour

test_calendar:

table test
Day 
16.01.2009 
17.01.2009 
18.01.2009 
19.01.2009 
20.01.2009 
21.01.2009 
22.01.2009 
23.01.2009 
24.01.2009 
25.01.2009 
26.01.2009 

contient bagin et la finition de inctance:

DFROM DTILL 
18.01.2009 21.01.2009 
19.01.2009 20.01.2009 
20.01.2009 20.01.2009 

Voici une requête besoin:

select day, (select count(1) 
    from test where dfrom<=t.day and dtill>=t.day) from test_calendar t 
where day>to_date('15.01.2009','DD.MM.YYYY') 
order by day 
0

Un grand merci pour les solutions gars - a réussi à le faire fonctionner en utilisant une partie du SQL ci-dessus et aussi des morceaux de PHP de la deuxième solution.

Vraiment l'apprécier, acclamations :)

Questions connexes