Выбор из базы данных MySQL на основе частей временной метки - PullRequest
2 голосов
/ 01 февраля 2010

Есть ли способ выбрать строки из БД, где отметка времени находится в определенном году? У меня нет конкретной временной метки, только диапазон (например, все временные метки в течение 2009 года). Есть ли способ сделать это? Как еще я могу сделать что-то подобное? Спасибо за вашу помощь!

-iMaster

Ответы [ 4 ]

3 голосов
/ 01 февраля 2010

Использование:

WHERE timestamp_col BETWEEN STR_TO_DATE('2009-01-01', '%Y-%m-%d') 
                        AND STR_TO_DATE('2009-12-31', '%Y-%m-%d')

Любые функции, выполняемые для столбца, означают, что индекс, если он существует для этого столбца, не может быть использован.

Я использовал функцию STR_TO_DATE, чтобы гарантировать, что любая дата, представленная в виде строки, может быть интерпретирована MySQL как TIMESTAMP.

Справка:

1 голос
/ 08 февраля 2010

Важное дополнение к превосходным предложениям, уже приведенным здесь: если вы планируете выполнить этот запрос как часть рендеринга ваших страниц (в отличие от запуска этого как разового отчета), вам действительно следует учитывать производительность. Индексы не сильно вам помогут, если вы постобработаете значение столбца с помощью функции, прежде чем сравнивать его с чем-то.

В этом случае я хотел бы рассмотреть вопрос о создании отдельного столбца базы данных, который содержит ПРОСТО год, или только месяц, и т. Д.

1 голос
/ 07 февраля 2010

Так же просто, как:

SELECT * FROM table WHERE YEAR(timestamp) = '1999'
1 голос
/ 01 февраля 2010

Использовать FROM_UNIXTIME аналогично этому:

SELECT
  FROM_UNIXTIME(my_timestamp, '%Y') AS year
FROM
  table_name
WHERE
  FROM_UNIXTIME(my_timestamp, '%Y') = 2009;

Где 'my_timestamp' - это имя вашего столбца отметки времени.

В качестве альтернативы вы также можете преобразовать его в DATETIME

Если вы конвертируете его в datetime, вы можете сделать это с помощью функции mysql DATE_FORMAT, которая позволяет вам взять DATETIME и отформатировать его как дату. Затем сгруппируйте по этому столбцу.

  private function _formatDate() {
    if ($this->_granularity == 'month') {
      return '%y/%M';
    }elseif($this->_granularity == 'day') {
      return '%y/%M/%d';
    }
  } 

  public function getmyquery() {
    $query = "
 SELECT count( * ) as visits, DATE_FORMAT( `myOriginalDateField` , '".$this->_formatDate()."' ) AS mydate
 FROM `mys`
 WHERE id = ".$this->_Id."
 GROUP BY mydate
 ORDER BY mydate ASC
 ";
    return $query
  }
...