Jak odjąć 30 dni od bieżącej daty i godziny w mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Każdemu, kto nie chce używać DATE_SUB
, użyj CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
. Ponieważ w pytaniu wspomniano „odejmij 30 dni od bieżącej daty i godziny ”, może nie być to, czego chce PO.current_timestamp
zamiastcurrent_date
Nie używaj,
NOW()
ponieważ tracisz pamięć podręczną lub optymalizację zapytania, ponieważ zapytanie jest za każdym razem inne. Zobacz listę funkcji, których nie powinieneś używać w dokumentacji MySQL .W poniższym kodzie załóżmy, że ta tabela rośnie z czasem. Dodano nowe rzeczy i chcesz pokazać tylko te z ostatnich 30 dni. To najczęstszy przypadek.
Pamiętaj, że data została dodana jako ciąg. Lepiej jest dodać datę w ten sposób, z kodu wywołującego, niż używać
NOW()
funkcji, ponieważ zabija ona buforowanie.Możesz użyć,
BETWEEN
jeśli naprawdę chcesz tylko rzeczy z tego od drugiego do 30 dni przed tym drugim, ale nie jest to częsty przypadek użycia z mojego doświadczenia, więc mam nadzieję, że uproszczone zapytanie może ci dobrze służyć.źródło
NOW()
i nadal używasz go w swojej odpowiedzi. o_O PS: zapytanie zwróci inny wynik, a nie to, czego prawdopodobnie chce OPBETWEEN
i>=
czy różni są operatorzy, wiesz? Moje zapytanie ogranicza zestaw wyników dla30 days ago AND today
tegoeverything after 30 days ago
. Tak więctomorrow
rekordy nie będą pasować do mojego i twojego oryginalnego zapytania, ale będą pasować do tej odpowiedziMySQL odejmij dni od teraz:
Wydruki:
Inne argumenty jednostki wyrażenia czasowego:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
źródło
Możesz także użyć
źródło
Możesz sformatować używając formatu daty w SQL.
źródło
Inny sposób
źródło
Jeśli potrzebujesz tylko daty, a nie godziny, użyj:
Ponieważ
curdate()
pomija komponent czasu, jest potencjalnie szybszynow()
i bardziej „semantycznie poprawny” w przypadkach, gdy interesuje Cię tylko data.Ponadto
subdate()
przeciążenie 2-arowe jest potencjalnie szybsze niż używanieinterval
.interval
jest przeznaczony dla przypadków, gdy potrzebujesz komponentu innego niż dzień.źródło
subdate(curdate(), 30)
to jest szybsze niżCURRENT_DATE - INTERVAL 30 DAY
? Czy masz dowód? A jak szybko by to było? Kilka mikrosekund?subdate
, że potencjalnie szybszy czas jest prawdopodobnie, twoim zdaniem, wyjaśniony przez „przeciążenie 2-arów”, ale proszę wybacz mi, jeśli jest to głupie pytanie, co oznaczają te słowa (w odniesieniu do funkcji )? W szczególności czym jest „2-arity”?curdate()
może faktycznie być zły wybór, bo PO wydawało się chce „odjąć 30 dni od bieżącej datetime ” (kopalnia nacisk).