sql >> Databasteknik >  >> RDS >> Mysql

Laravel Eloquent jämför datum från datetime-fältet

Laravel 4+ erbjuder dig dessa metoder:whereDay() , whereMonth() , whereYear() (#3946 ) och whereDate() (#6879 ).

De gör SQL DATE() arbeta för dig och hantera skillnaderna i SQLite.

Ditt resultat kan uppnås så här:

->whereDate('date', '<=', '2014-07-10')

För fler exempel, se första meddelandet av #3946 och den här Laravel Daily-artikeln .


Uppdatering: Även om metoden ovan är bekväm, är den, som noterats av Arth, ineffektiv på stora datamängder, eftersom DATE() SQL-funktion måste appliceras på varje post, vilket förkastar det möjliga indexet.

Här är några sätt att göra jämförelsen (men läs anteckningarna nedan):

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

Anmärkningar:

  • 23:59:59 är okej (för nu) på grund av 1-sekunds precision, men ta en titt på den här artikeln:23:59:59 är inte slutet på dagen. Nej, verkligen!
  • Tänk på fallet "noll datum" ("0000-00-00 00:00:00"). Även om dessa "nolldatum" bör undvikas, är de källan till så många problem. Bättre att göra fältet nullbart om det behövs.


  1. Installera PDO-drivrutiner för PostgreSQL på Mac (med Zend för eclipse)

  2. Huawei GaussDB

  3. MySQL Great Circle Distance (Haversine-formel)

  4. minneseffektiv inbyggd SqlAlchemy iterator/generator?