suit: MySQL Abfrage

Beitrag lesen

SELECT *
FROM   calendar
WHERE  date BETWEEN '2012-01-01' AND DATE_SUB(DATE_ADD('2012-01-01', INTERVAL 1 MONTH), INTERVAL 1 DAY)

  
  
Für deine erste Problemstellung ist wohl das Arbeiten mit YEAR() und MONTH() um einiges kürzer und verständlicher - und erfordert weit weniger Operationen.  
  
Tag abziehen und Monat dazuzählen? Das versteht keiner beim ersten Hinschauen. Du willst doch alle Daten die sich mit dem gegebenen Jahr und Monat decken? Dann schreib es so oder wundere dich nicht, warum du in 3 Monaten nicht mehr weißt, was das eigentlich tut :)  
  
`WHERE (YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW()) -- aktuelles Datum`{:.language-sql}  
`WHERE (YEAR(date) = 2012 AND MONTH(date) = 1) -- beliebers Datum`{:.language-sql}  
  

> ~~~sql
  

> SELECT *  
> FROM   `calendar`  
> WHERE  `date` BETWEEN '2012-01-16' AND DATE_ADD('2012-01-16', INTERVAL 13 DAY)  
> 

Wenn es dir um "heute + 13 Tage" geht, ist NOW() jedenfalls besser als das Datum manuell hinzufrickeln.

Und auch wenn Tom sagt, DATE_ADD() wäre besser geeignet - ich meine dennoch, dass DATEDIFF() eleganter - und vor allem kürzer - ist, sofern es um Tage geht. Mit anderen Einheiten stößt man mit DATEDIFF() auf taube Ohren.

WHERE DATEDIFF(date, NOW()) < 14 -- vom aktuellen Tag
WHERE DATEDIFF(date, '2012-01-01') < 14 -- von einem beliebigen Tag an

ich hoffe das ist nun der Beste Lösungsweg :)

Das kommt drauf an, wie du das definierst:

  1. Performance?
    Benchmarken

  2. Verständlichkeit
    Das erste ist wenig nachvollziehbar, beim zweiten sehe ich keine Probleme

  3. Codelänge
    Da gibts sicher einsparungspotential

4 Selbst erarbeitet
Was gibt es schöneres? :)