sql >> Databasteknik >  >> RDS >> Mysql

Från tidsstämpeln i SQL, val av poster från idag, igår, denna vecka, denna månad och mellan två datum php mysql

Om du endast väljer efter datum, basera dina beräkningar på CURDATE (som endast returnerar datum) snarare än NOW (som returnerar datum och tid). Dessa exempel kommer att fånga alla tider inom dagsintervallen:

  • Idag:WHERE timestamp >= CURDATE()
  • Igår:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • Denna månad:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Mellan de två datumen 3 juni 2013 och 7 juni 2013 (notera hur slutdatumet anges som 8 juni, inte 7 juni):WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

"denna vecka" beror på vilken dag du börjar din vecka; Jag lämnar det till dig. Du kan använda DAYOFWEEK funktion för att justera CURDATE() till rätt intervall.

Tillägg :OP:s kolumntyp var INTEGER , lagrar en UNIX-tidsstämpel, och mitt svar antog att kolumntypen var TIMESTAMP . Så här gör du samma saker med ett UNIX-tidsstämpelvärde och fortfarande bibehåller optimering om kolumnen är indexerad (som svaren ovan kommer att göra om TIMESTAMP kolumnen är indexerad)...

I grund och botten är lösningen att bara slå in start- och/eller slutdatum i UNIX_TIMESTAMP funktion:

  • Idag:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Igår:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • Denna månad:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Mellan de två datumen 3 juni 2013 och 7 juni 2013 (notera hur slutdatumet anges som 8 juni, inte 7 juni):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')



  1. PostgreSQL felaktig sortering

  2. mysql får last_insert_id() i en trigger

  3. Migrera från traditionell replikering till GTID

  4. Varför MySQL:s LEFT JOIN returnerar NULL-poster när med WHERE-klausul?