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();
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();
Odpowiedzi:
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_timestampzamiastcurrent_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.
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ć.
NOW()i nadal używasz go w swojej odpowiedzi. o_O PS: zapytanie zwróci inny wynik, a nie to, czego prawdopodobnie chce OP
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
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
Możesz także użyć
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Możesz sformatować używając formatu daty w SQL.
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ń.
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).