PHP / Oracle tarih aralıkları ile çalışma

4 Cevap php

Ben çok farklı aralıkları, farklı bir gün çok farklı örnekleri ortaya nasıl çalışmak gerekir. Bir örnek ile açıklamak için muhtemelen en iyi.

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

Yukarıdaki üç örnek kullanarak, bu bilgileri toplamak ve küçük bir şey gibi göstermek için ihtiyacınız ...

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

... Ben bir Oracle veritabanı FWIW (^ yukarıda dolayısıyla formatı) gelen bilgileri kapma olacak ve yüzlerce, kayıtların belki binlerce, döngüler her türlü yapmak ve ifadeler için sonsuza kadar alacağını eğer öyleyse benim topal girişimi olacak çalıştırın.

Bunu yapmanın herhangi oldukça basit ve etkili bir yolu var mı? Ben ne yazık ki nerede başlar gerçekten çok emin değilim ...

Teşekkürler

4 Cevap

DB motoru ya da PHP kodu Ya tarih aralığında döngü zorunda olacak.

İşte toplamını yapmak için bazı PHP kodu bulunuyor. Gün sayıları year-month geniş bir tarih aralığı için büyük bir yelpazeye sahip önlemek tarafından saklanır.

<?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>";
  }
}

?>

Siz açıklanan yöntem kullanabilirsiniz 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

Her gün için bir satır ile bir tablo gerekir

test_calendar:

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

masa testi Bagin ve inctance şekilde bitirmek içerir:

DFROM   DTILL
18.01.2009  21.01.2009
19.01.2009  20.01.2009
20.01.2009  20.01.2009

Burada ihtiyacınız olan bir sorgu:

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

Çözümleri çocuklar için büyük bir teşekkür - bu ikinci çözüm PHP'nin yukarıda ve ayrıca bit gelen SQL bazılarını kullanarak çalışma başardı.

Gerçekten, şerefe takdir :)