Jak odjąć 30 dni od bieżącej daty i godziny w mysql?

196

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();
użytkownik784637
źródło

Odpowiedzi:

128

Każdemu, kto nie chce używać DATE_SUB, użyj CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Doug Fir
źródło
2
Dałbym to +10, gdybym mógł. SQL powinien przede wszystkim dotyczyć czytelności, a jest to najbardziej czytelny sposób na zrobienie tego.
Colin 't Hart
9
Bardziej czytelny, ale inny wynik niż używanie 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.
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ, a następnie użyj current_timestampzamiastcurrent_date
isapir
21

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.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

Możesz użyć, BETWEENjeś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ć.

Joseph Lust
źródło
3
Więc nie zaproponowałeś żadnego zastosowania NOW()i nadal używasz go w swojej odpowiedzi. o_O PS: zapytanie zwróci inny wynik, a nie to, czego prawdopodobnie chce OP
zerkms
@zerkms W jaki sposób to zapytanie dałoby inny zestaw wyników niż zapytanie?
user784637
2
@ user784637: uhm BETWEENi >=czy różni są operatorzy, wiesz? Moje zapytanie ogranicza zestaw wyników dla 30 days ago AND todaytego everything after 30 days ago. Tak więc tomorrowrekordy nie będą pasować do mojego i twojego oryginalnego zapytania, ale będą pasować do tej odpowiedzi
zerkms
Okej, mój zły. Zazwyczaj takie zapytania są w tabelach na żywo, które rosną z czasem. Dlatego porzuciłem między. Wyjaśniłem moją odpowiedź powyżej.
Joseph Lust
@JosephLust, Aby rozwiązać problemy z wydajnością, użyj mojego rozwiązania .
Pacerier
17

MySQL odejmij dni od teraz:

select now(), now() - interval 1 day

Wydruki:

2014-10-08 09:00:56     2014-10-07 09:00:56

Inne argumenty jednostki wyrażenia czasowego:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 
Eric Leschinski
źródło
16

Możesz także użyć

select CURDATE()-INTERVAL 30 DAY
Noby Nirmal
źródło
1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Możesz sformatować używając formatu daty w SQL.

Varaj Vignesh
źródło
0

Inny sposób

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
zzapper
źródło
0

Jeśli potrzebujesz tylko daty, a nie godziny, użyj:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

Ponieważ curdate()pomija komponent czasu, jest potencjalnie szybszy now()i bardziej „semantycznie poprawny” w przypadkach, gdy interesuje Cię tylko data.

Ponadto subdate()przeciążenie 2-arowe jest potencjalnie szybsze niż używanie interval. intervaljest przeznaczony dla przypadków, gdy potrzebujesz komponentu innego niż dzień.

Pacerier
źródło
11
Twierdzisz, że 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?
ypercubeᵀᴹ
2
Nie mam pojęcia. Z pewnością nie mogę głosować za własnymi komentarzami. Co do „potencjalnie” szybszego roszczenia, nadal nie widzę dowodów, decydujących ani poszlakowych. I nawet jeśli jest nieco szybszy, warunek zostanie oceniony raz. O ile nie uruchomisz zapytania milion razy na minutę, różnica nie będzie miała znaczenia.
ypercubeᵀᴹ
2
Domyślam się 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”?
Andriy M
1
Ponadto, o ile treść pytania, curdate()może faktycznie być zły wybór, bo PO wydawało się chce „odjąć 30 dni od bieżącej datetime ” (kopalnia nacisk).
Andriy M
1
@AndriyM, Cóż, ponieważ ten wątek uzyskuje 50 000 wyświetleń, pozostawię tutaj odpowiedź osobom, które są zainteresowane tylko składnikiem czasu. A w odniesieniu do „arity” odnosi się do wielu argumentów . Tak, to prawda, dla wszystkich rzeczy równych, funkcja 2-arowa jest potencjalnie szybsza niż funkcja 3-arowa. Tak będzie, dopóki nowe informacje nie zostaną dodane do tablicy.
Pacerier,