it-swarm.dev

Datownik MySQL wybierz zakres dat

Nie wiem, od czego zacząć. Czy ktoś może mi pomóc/wskazać mi właściwy kierunek.

Mam kolumnę datownika w MySQL i chcę na przykład wybrać zakres dat, wszystkie znaczniki czasu, które są w październiku 2010 roku.

Dzięki.

33
DRKM

Zazwyczaj tak by było:

SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>='2010-10-01'
   AND yourtimetimefield< '2010-11-01'

Ale ponieważ masz uniksowe znaczniki czasu, będziesz potrzebował czegoś takiego:

SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>=unix_timestamp('2010-10-01')
   AND yourtimetimefield< unix_timestamp('2010-11-01')
43

Kompaktowa, elastyczna metoda znaczników czasu bez ułamkowych sekund byłaby następująca:

SELECT * FROM table_name 
WHERE field_name 
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59')

Jeśli używasz ułamkowych sekund i najnowszej wersji MySQL, lepiej byłoby przyjąć operację wykorzystującą operatory >= i < jako Odpowiedź Woutera

Oto przykład pól czasowych zdefiniowanych z ułamkową drugą precyzją (maksymalna precyzja w użyciu):

mysql> create table time_info (t_time time(6), t_datetime datetime(6), t_timestamp timestamp(6), t_short timestamp null);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into time_info set t_time = curtime(6), t_datetime = now(6), t_short = t_datetime;
Query OK, 1 row affected (0.01 sec)

mysql> select * from time_info;
+-----------------+----------------------------+----------------------------+---------------------+
| 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34 |
+-----------------+----------------------------+----------------------------+---------------------+
1 row in set (0.00 sec)
37
Cez
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31'
5
Dan Grossman

Widzę ludzi, którzy komentują to pytanie. Ale myślę, że proste użycie LIKE może być łatwiejsze do uzyskania danych z tabeli. 

SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%'

Użyj zmiennej LIKE i wyszukuj dzikie znaki danych. Mam nadzieję, że rozwiąże to twój problem.

4
abhijitcaps

To zapytanie SQL wyodrębni dane dla Ciebie. Jest łatwy i szybki.

SELECT *
  FROM table_name
  WHERE extract( YEAR_MONTH from timestamp)="201010";
3
Juanma Font

W miarę możliwości unikaj stosowania funkcji do kolumny w klauzuli where:

SELECT *
  FROM table_name
 WHERE timestamp >= UNIX_TIMESTAMP('2010-10-01 00:00:00') 
   AND timestamp <  UNIX_TIMESTAMP('2010-11-01 00:00:00');

Zastosowanie funkcji do kolumny znacznika czasu (np. FROM_UNIXTIME (znacznik czasu) = ...) znacznie utrudnia indeksowanie.

3
Markus Winand

Jeśli masz znacznik czasu mysql, coś takiego jak 2013-09-29 22:27:10 możesz to zrobić 

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

Konwertuj na unix, a następnie użyj funkcji czasu unix, aby wyodrębnić miesiąc, w tym przypadku 9 na wrzesień.

0
Federico