sql >> Databáze >  >> RDS >> Mysql

Z časového razítka v SQL, výběr záznamů z dneška, včerejška, tohoto týdne, tohoto měsíce a mezi dvěma daty php mysql

Pokud vybíráte pouze podle data, založte své výpočty na CURDATE (které vrací pouze datum) spíše než NOW (který vrátí datum a čas). Tyto příklady zachytí všechny časy v rámci denních rozsahů:

  • Dnes:WHERE timestamp >= CURDATE()
  • Včera:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • Tento měsíc:WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Mezi dvěma daty 3. června 2013 a 7. června 2013 (všimněte si, že datum ukončení je uvedeno na 8. června, nikoli 7. června):WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

„Tento týden“ závisí na tom, kterým dnem týden začínáte; To nechám na vás. Můžete použít DAYOFWEEK funkce k vyladění CURDATE() do správných rozsahů.

Dodatek :Typ sloupce OP byl INTEGER , ukládající časové razítko UNIX a moje odpověď předpokládala, že typ sloupce byl TIMESTAMP . Zde je návod, jak dělat všechny stejné věci s hodnotou časového razítka UNIX a stále udržovat optimalizaci, pokud je sloupec indexován (jako odpovědi výše, pokud je TIMESTAMP sloupec je indexován)...

V zásadě je řešením jen zabalit počáteční a/nebo koncová data do UNIX_TIMESTAMP funkce:

  • Dnes:WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Včera:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • Tento měsíc:WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Mezi dvěma daty 3. června 2013 a 7. června 2013 (všimněte si, že datum ukončení je uvedeno na 8. června, nikoli 7. června):WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')



  1. Načtěte data CSV do MySQL v Pythonu

  2. MÍSTO spouštěčů – část 1

  3. Stránkování MySQL bez dvojitého dotazování?

  4. Vyberte N-tý řádek z tabulky v Oracle