SORU
27 EYLÜL 2008, CUMARTESİ


Karşılaştırma tarih aralıkları

Eğer tarih aralığını bir listesi var Eğer MySQL, (Aralık-başlangıç ve Aralık sonu). örneğin

10/06/1983 to 14/06/1983
15/07/1983 to 16/07/1983
18/07/1983 to 18/07/1983

Ve eğer başka bir tarih aralığı aralıkları HERHANGİ bir listede zaten, bunu nasıl yapacağım? varsa kontrol etmek istiyorum

örneğin

06/06/1983 to 18/06/1983 = IN LIST
10/06/1983 to 11/06/1983 = IN LIST
14/07/1983 to 14/07/1983 = NOT IN LIST

CEVAP
27 EYLÜL 2008, CUMARTESİ


Bu klasik bir sorundur ve eğer bu mantık tersine daha kolay olur.

Sana bir örnek vereyim.

Zaman bir süre burada, ve bir şekilde çakışan süreler dışında farklı varyasyonlar göndeririz.

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

öte yandan, bana örtüşmeyen, bütün o post

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

Eğer öyleyse basit bir karşılaştırma azaltmak için:

starts after end
ends before start

o zaman örtüşmeyen, tüm bu bulabilirsiniz, ve sonra uyuşmayan tüm aşamalarını bulabilirsiniz.

Sizin nihai LİSTE örnekte, bu iki kurallara uyuyor.

Aşağıdaki dönemleri veya aralıkları DIŞINDA hava karar vermeniz gerekir:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

Eğer tablonuz varsa sütunlar ve range_start, burada range_end denilen tüm eşleşen satırları almak için bazı basit SQL:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

NotDEĞİLorada. İki basit kurallar beri tüm bulurbirbiriyle uyumlu olmayansıra basit DEĞİL bunu söylemek ters olur:eğer olmayan eşleşen satırları biri değilse, eşleştirme olanlardan biri olmalı.

Burada basit ters mantık ile bitireceğiz DEĞİL kurtulmak ve almak için başvuru:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008