2016-12-09 7 views
0

Ich habe zwei Tabellen org_years und year_days Strukturen davon sind wie folgt:Zwei Tabellen nach Datumsbereich

org_years table

year_days table

Ich suche eine Auflistung aller Tage für diese Organisation zu erhalten und die Orgjahrs-ID, zu der sie gehören.

 org_years.id | for_date 
------------------------------------- 
     1    2016-01-01 
     1    2016-01-02 
     1    2016-01-03 
     1    2016-01-04 
     .. 
     .. 
     1    2016-12-31 
     2    2017-01-01 
     2    2017-01-02 

Die Datumsbereiche müssen nicht immer vom 1. Januar bis 31. Dezember sein. Es ist nur ein Beispiel. Diese können zu jeder Zeit des Jahres Datumsbereiche sein.

Auch Datumsbereiche überlappen sich nie. Auch die PHP-Anwendungslogik sorgt dafür, dass es keine Lücken in den Datumsbereichen gibt. Ein Tag wird immer in einem Datumsbereich liegen.

+0

Sie haben eine Tabelle, die ein Jahr am ersten Tag des Jahres beginnt aufzeichnet und endet am letzten Tag des Jahres. Ich bin verblüfft. – Strawberry

+0

aktualisiert meine Beschreibung :) diese können benutzerdefinierte Datumsbereiche auch –

+0

Sie müssen nicht sein. Aber sie sind immer * – Strawberry

Antwort

1

Sie ein LEFT JOIN bewtween year_days und org_years, in dessen Jahr Bereich die for_date fallen um zu sehen, die Überprüfung für jeden Datensatz in year_days. Beachten Sie, dass ich die Möglichkeit in Betracht ziehe, dass ein Tag in Ihrer org_years Kalendertabelle möglicherweise nicht in einen Bereich fällt. In diesem Fall wird -1 als id angezeigt.

SELECT COALESCE(t2.id, -1) AS org_years_id, 
     t1.for_date 
FROM year_days t1 
LEFT JOIN org_years t2 
    ON t1.for_date BETWEEN t2.year_start_on AND t2.year_end_on 
+0

Ich werde Anwendungslogik verwenden, um sicherzustellen, dass ein Tag immer in einem Datumsbereich fallen muss. Außerdem müssen die Datumsbereiche nicht immer vom 1. Januar bis zum 31. Dezember sein. Dies können Datumsbereiche zu jeder Zeit des Jahres sein. Ich werde diese Abfrage ausführen und es jetzt überprüfen :) –

0

bitte unten beitreten verwendet Bedingung

select t1.*,t2.* from Table1 t1 left join Table2 t2 ON 
DATE_FORMAT(t1.year_start_on,'Y') = t2.for_date 
Verwandte Themen