Tarih sorgu ve ekran

5 Cevap php

Şu anda çalışanlar için zaman-off istekleri izlemek için küçük bir program yazmaya çalışıyorum. Ben MySQL ve PHP için oldukça yeni, bu yüzden de benim için bir öğrenme proje. Ben anlamaya mümkün görünmüyor, bu sorun haline çalıştırmak.

Ben bir haftada (Pazartesi-Cuma) için istekleri zaman kapalı göstermek istiyorum. Ben bir 'startTime' ve ayrı alanlarda 'EndTime', Tarih ikisi / Saat ile bir table 'istekleri' de istekleri var.

Şu anda kolayca arama ve (veya her ikisi) StartTime veya verilen ISO hafta içinde düşecek EndTime değerleri I (WeekOfYear ()) bakıyorum ya var isteklerini alabilirsiniz.

Ne yapmam gerekiyor ben o hafta boyunca startTime veya EndTime var görüntüleniyor, ama değilim ISO haftasında günleri içerebilir istekleri için arama.

Örnek:

  1. Çalışan Hafta 24 Cuma'ya Hafta 24 Salı kapalı alır.

    Şu anda, doğru çalışan kapalı Salı başlayan ve Cuma günü bir dönüş göstermek, ama Çar ve Perşembe hiçbir şey girmiş olur olduğunu göstermek olacaktır.

  2. Çalışan Hafta 32 Pazartesi yoluyla Haftası 30 Cuma kapalı alır.

    Arama onlar bütün hafta kapalı aslında olsa bile o hafta boyunca startTime ya EndTime göstermek olmaz çünkü şu anda, ben olmaktan Haftası 31 sırasında 'kapalı' olarak değil, çalışan gösterecektir. StartTime ve EndTime doğru günlerde not olurdu rağmen.

Şu anda, ne bu geçici bir çözüm için yapılacak Haftası 31 boyunca her gün Pazartesi-Cuma için tarih db her isteğinin startTime ve EndTime ARASINDA yer olup olmadığını kontrol etmek 5 ek sorguları çalıştırılır.

Ben bu bilgileri almak için 6 sorguları toplam çalıştırmak için nefret ediyorum. Bu bilgileri almak için daha kolay bir yolu var mı?

5 Cevap

Ben sadece olaylar için bir takvim uygulaması yazdı ve böyle bir şey dersin bu-how koştu:

SELECT * FROM Requests WHERE 
Start_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
End_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
<day_of_week_monday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_tuesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_wedenesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_thursday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_friday> BETWEEN Start_Date AND End_Date
GROUP BY ID ORDER BY Start_Date ASC, Date ASC

Iken < value_names> istenen anda görüntülenen hafta üzerinden php ile oluşturulur. Üsleri kapsamalıdır.

DB saklanan bu tarihler ne biçim vardır? Onlar MySQL DATE biçimi, yapmak onun oldukça kolay kullanarak varsayarak. Sadece alanlarda karşılaştırma operatörleri kullanabilirsiniz ve MySQL bir sorguda sizin için çalışma yapacağız.

$sql = "SELECT * FROM table WHERE startdate <= $someday AND $someday <= enddate";

Bunu yapmanın yıllık yol senin hafta tutunan, geçerli hafta kapalı başlayarak haftanın aralığı ve biten hafta kapalı içine düşerse görmek için bir kontrol çalıştırabilirsiniz.

SELECT * FROM table WHERE WEEKOFYEAR(Starttime) <= N AND WEEKOFYEAR(Endtime) >= N;

(N hafta nerede gösterdiğinizi)

Eğer satırları aldıktan sonra yapmak istediğiniz ne, o gün startTime ve BitişZamanı arasında düşerse görmek için PHP her gün ayrıştırmak değildir.

Bunun için iyi bir yöntem kullanıyor:

$start_timestamp = strtotime($row['Starttime']);
$end_timestamp = strtotime($row['Endtime']);

Eğer görüntülediğiniz günün bir zaman damgası almak için benzer bir yöntemi kullanmak, ve o gün kapalı olup olmadığını belirlemek için $ arasında start_timestamp ve $ end_timestamp düşerse görebilirsiniz.

Eğer ekran olarak PHP belirtilen beri:

$start=30; //Friday of Week 30
$end=32; //Monday of Week 32

foreach (range($start, $end) as $number) {
    echo $number;
}

Sen 30,31,32 almak için beklenebilir.

O $ başlangıç ​​olduğunu doğrulamak zorunda olacak < $ Ocak hafta Aralık ayı için de olsa sonunda.

WeekOfYear için aralık () 1-53 olduğunu. Bu durumda, $ sonuna kadar 53 eklemek ve eğer daha fazla 53 $ sona MOD görüntüler:

$start=52; //Friday of Week 52, 2009
$end=2; //Monday of Week 2, 2010

If($start>$end) $end+=53;
foreach (range($start, $end) as $number) {
    if($number>53){
        echo $number%53;}
    else{
        echo $number;
    }
}

Sen 52,53,1,2 almak için beklediğiniz

Muhtemelen ya büyük tüm ameliyathanelerinde ile tek ya da bunun gibi bir şey gibi okumak sorgu gerekir

WHERE Starttime <= AND Endtime >=

Yapmak için daha kolay bir yolu olabilir ama o ... sen could bu hafta içinde düşecek, o zaman o gerçek hafta olanları bulmak için PHP ile olsun kayıtlarını ayrıştırma ihtiyacınız olan tüm tarihleri ​​almalısınız ki ...