Не уверен, с чего начать с этого. Может кто-нибудь помочь/указать мне в правильном направлении.
У меня есть столбец timestamp в MySQL, и я хочу выбрать диапазон дат, например, все отметки времени, которые находятся в октябре 2010 года.
Спасибо.
Не уверен, с чего начать с этого. Может кто-нибудь помочь/указать мне в правильном направлении.
У меня есть столбец timestamp в MySQL, и я хочу выбрать диапазон дат, например, все отметки времени, которые находятся в октябре 2010 года.
Спасибо.
Обычно это будет:
SELECT *
FROM yourtable
WHERE yourtimetimefield>='2010-10-01'
AND yourtimetimefield< '2010-11-01'
Но поскольку у вас есть временные метки unix, вам понадобится что-то вроде этого:
SELECT *
FROM yourtable
WHERE yourtimetimefield>=unix_timestamp('2010-10-01')
AND yourtimetimefield< unix_timestamp('2010-11-01')
Компактный, гибкий метод для временных меток без дробных секунд:
SELECT * FROM table_name
WHERE field_name
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59')
Если вы используете дробные секунды и недавнюю версию MySQL, тогда вам лучше использовать подход >=
и <
в соответствии с Ответ Wouter.
Ниже приведен пример временных полей, заданных с дробной второй точностью (максимальная точность использования):
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)
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31'
По возможности избегайте применения функций к столбцу в предложении 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');
Применение функции к столбцу временной метки (например, FROM_UNIXTIME (timestamp) =...) делает индексирование намного сложнее.
Этот SQL-запрос будет извлекать данные для вас. Это легко и быстро.
SELECT *
FROM table_name
WHERE extract( YEAR_MONTH from timestamp)="201010";
Я вижу, что люди дают много комментариев по этому вопросу. Но я думаю, что простое использование LIKE
может быть проще получить данные из таблицы.
SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%'
Используйте LIKE
и отправляйте поиск по диким символам. Надеюсь, это решит вашу проблему.
Если у вас есть timestamp mysql, что-то вроде 2013-09-29 22:27:10
, вы можете сделать это
select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9;
Преобразуйте в unix, затем используйте временные функции unix для извлечения месяца, в этом случае 9 для сентября.