2016-12-21 3 views
0

Ich habe eine Abfrage, die fein gearbeitet, bis ich in einem Datumsbereich hinzugefügt:MySql Zeitraum von Monat Hinzufügen

WHERE c.content_date BETWEEN MONTH($date) AND MONTH($today)

Grundsätzlich mag ich für Monat alle Inhalte aus dem inputed Datum bis heute. So zum Beispiel wenn $today war 2017-1-23 und $aDate wurde 2016-11-20 ich würde den gesamten Inhalt von November bis Januar wollen (des nächsten Jahres)

Abfrage

$result = DB::query("SELECT ".Content::$mDefaultContentListSelect." 
        FROM crowdhub_content_to_buckets ctb 
        LEFT JOIN crowdhub_content c 
        WHERE c.content_date BETWEEN MONTH($date) AND MONTH($today) 
        ON ctb.crowdhub_content_to_buckets_content = c.content_id 
        WHERE ctb.crowdhub_content_to_buckets_bucket IN (SELECT bucket_id FROM crowdhub_buckets b WHERE b.bucket_name IN %ls) 
        AND ctb.crowdhub_content_to_buckets_content 
        IN (SELECT content_to_tag_content AS content_id FROM crowdhub_content_to_tags 
        WHERE content_to_tag_tag IN (SELECT tag_id FROM crowdhub_tags WHERE tag_name IN %ls)) ".$active." ORDER BY ".$sort_string." LIMIT ".($aCount * $aPageId).",".$aCount, $buckets, $tags); 
+0

Bitte senden Sie den Fehler, den Sie – FallAndLearn

+0

bekommen kann ein beliebiges Datum existieren> $ heute? – McNets

+0

kein Fehler, nur kein Inhalt. Wenn ich das entferne, bekomme ich den ganzen Inhalt – Packy

Antwort

0

Dies sollte der erste Tag des Monats zurück:

DATE_SUB($date, INTERVAL DAYOFMONTH($date)-1 DAY) 

und dies der letzte Tag des Monats:

LAST_DAY($today) 


WHERE c.content_date BETWEEN DATE_SUB($date, INTERVAL DAYOFMONTH($date)-1 DAY) AND LAST_DAY($today) 
0

Wenn Datentyp der content_date Spalte ist DATE (und wir nur raten, wir haben keine Möglichkeit, dass zu wissen) ...

Wenn ein DATE Ausdruck zu einem integer Wert, das Datum Ausdruck wird als Ganzzahl ausgewertet. Ein Datumswert von "2016-12-21" wird zu einem Ganzzahlwert Wert nördlich von 20 Millionen ausgewertet. 20,161,221 um genau zu sein.

Und das Integer-Wert wird auf nicht weniger als oder gleich 12.


Als Demonstration:

SELECT MONTH('2016-12-21') 

ganzzahligen Wert von 12 zurück.


Also, entfernen Sie diese MONTH Funktion. Und denken Sie darüber nach, was date Werte mit denen Sie vergleichen möchten. Und verwende Ausdrücke, die diese Datumswerte auswerten.


„wenn $ war heute 2017.01.23 und $ aDate war 2016.11.20 Ich möchte alle Inhalt von November bis Januar (des nächsten Jahres)“

Dann tun der Vergleich mit Datum Werte. Es scheint, wie Sie wollen etwas, das äquivalent sein wird:

WHERE c.content_date >= '2016-11-01' 
    AND c.content_date < '2017-02-01' 

Diese Bedingungen Wir können 2017.

TRUE (nur) für alle content_date Werte 2016 und Januar Dezember Ausdrücke im November 2016 verwenden, die zu diesen Datumswerten auswerten.Unter Verwendung der Datumswerte wie in der Frage gegeben, so etwas wie dieses:

WHERE c.content_date >= DATE_FORMAT('2016-11-23' ,'%Y-%m-01') 
    AND c.content_date < DATE_FORMAT('2017-01-23' + INTERVAL 1 MONTH,'%Y-%m-01') 

Wenn Sie vorhaben, Variablensubstitution in den SQL-Text zu tun, beachten Sie, dass Datum Literale sollten in Einzel eingeschlossen werden Zitate. Ohne einfache Anführungszeichen, werden die Striche als Subtraktion Operatoren

gesehen werden

vergleichen:

SELECT '2016-12-21' 

zu:

SELECT 2016-12-21  -- evaluates to integer value 1983