2012-09-06 8 views
7

do dzisiaj, kiedy pracowałem z MySQL i musiałem wykonywać akcje z datą/czasem używałem kolumny int z uniksowym znacznikiem czasu i nie było żadnych problemów, ale dzisiaj po przeczytaniu niektórych przewodników zdecydowałem się testowa kolumna znacznika z domyślnym "current_timestamp".MySQL Wybierz dane z ostatniego miesiąca przez current_timestamp

Więc jestem zainteresowany tym, jak wybrać dane z zeszłego miesiąca według kolumny, gdzie informacje są w formacie "2012-09-07 00:23:30"? A może są jakieś podchwytliwe pytania, co da mi dane od początku tego miesiąca (nie ostatnie 30 dni, ale od 09-01 00:00:00 do dziś)?

+0

Niedawno spotkałem się z podobnym problemem i zakończyłem obliczanie dat za pomocą języka po stronie serwera (w tym przypadku php, ale każdy pozwoli ci to zrobić). W każdym razie, także zainteresowany tym :) – jribeiro

+0

@jribeiro Wysłałem odpowiedź, spójrz. – Ariel

Odpowiedz

17

To daje poprzednim miesiącu:

WHERE dateColumn BETWEEN SUBDATE(CURDATE(), INTERVAL 1 MONTH) AND NOW(); 

ta od początku miesiąca:

WHERE dateColumn BETWEEN STR_TO_DATE('2012-09-01', '%Y-%m-%d') AND NOW(); 

Pomiędzy to nic specjalnego, to tylko skrót do

dateColumn <= ... AND dateColumn >= .... 

Hmm, domyślam się, że porównanie TERAZ() nie jest w rzeczywistości potrzebne, ponieważ wszystkie zapisy będą przedtem.

Więc po prostu zrobić:

WHERE dateColumn >= STR_TO_DATE('2012-09-01', '%Y-%m-%d') 

Dynamiczny początek bieżącego miesiąca:

WHERE dateColumn >= CURDATE() - INTERVAL DAY(CURDATE())-1 DAY 

Wszystko to nie jest wyodrębnić dzień miesiąca od bieżącej daty, a następnie odjąć, że wiele dni mniej jeden z tego.

+0

Problem z tym widzę, jeśli zapytanie musi być dynamiczne. Robię to, ale wciąż muszę znaleźć początek miesiąca po stronie serwera. Ale może to wykracza poza to, o co prosił PO. :) – jribeiro

+0

@jribeiro Dynamic nie stanowi problemu - zaktualizowałem odpowiedź. – Ariel

3

Należy przyjrzeć common_schema, jest łatwy w instalacji i ma wiele wspaniałych narzędzi, w tym funkcji o nazwie start_of_month() to jest dokładnie to, czego szukasz:

select * 
from your_table 
where your_column >= common_schema.start_of_month(now()) 
-1

Jeśli masz timestamp mysql coś jak 2013-09-29 22:27:10 można to zrobić

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

Konwersja do systemu UNIX, a następnie użyj funkcji czas uniksowy wyodrębnić miesiąc, w tym przypadku do 9 września.

+1

jeszcze lepiej 'wybierz * z tabeli, gdzie MIESIĄC (czas) = ​​(MIESIĄC (TERAZ()));' – Federico

+0

Co powiesz na ten miesiąc w przyszłym roku? – Mala

+0

może wybrać * z tabeli, gdzie MIESIĄC (czas) = ​​(MIESIĄC (TERAZ()) i ROK (czas) = ​​ROK (TERAZ())); – Stenyg

Powiązane problemy