SQL - Проверьте, какие годы содержат данные - PullRequest
1 голос
/ 10 октября 2009

Как выбрать только годы из базы данных MySQL (но только те годы, которые содержат данные)?

Функция PHP time () используется для заполнения даты в базе данных. С 2006 года хранится более 10 000 записей ...

Я бы хотел классифицировать данные по дате (сначала пользователь выбирает год, затем месяц, а не день ...). Я также хотел бы иметь возможность использовать подобный подход для выбора по месяцам и / или дням.

Ответы [ 4 ]

3 голосов
/ 10 октября 2009

Существуют функции MySQL, которые позволяют извлекать информацию года / месяца / даты из даты, но они работают с типом даты MySQL. Итак, сначала вам нужно преобразовать свою метку времени UNIX в дату, используя FROM_UNIXTIME(date), а затем извлечь часть информации, которую вы хотите. См. документы для списка доступных функций даты. Так, например, чтобы получить все годы вы можете использовать:

SELECT DISTINCT YEAR(FROM_UNIXTIME(date)) FORM table;

Если вы хотите позже отфильтровать фактические результаты, вы можете использовать это для получения всех строк за 2009 год:

SELECT ... WHERE YEAR(FROM_UNIXTIME(date)) = 2009

Если у вас нет веских причин для хранения метки времени в базе данных, я бы предложил преобразовать столбец в тип MySQL datetime. Это позволит вам использовать индекс для ускорения запроса. MySQL не может создавать индексы, используя определенные функции, поэтому вы не можете использовать YEAR() в запросе, но вы можете сделать, например:

SELECT ... WHERE date >= 2009 AND date <= 2009;
2 голосов
/ 10 октября 2009

Как выбрать только годы из базы данных MySQL (но только те годы, которые содержат данные)?

SELECT  DISTINCT(YEAR(datecolumn))
FROM    mytable

Я бы хотел классифицировать данные по дате (сначала пользователь выбирает год, затем месяц, а не день ...). Я также хотел бы иметь возможность использовать подобный подход для выбора по месяцам и / или дням.

SELECT  DISTINCT(MONTH(datecolumn))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT($year, '-01-01') AS DATETIME)
        AND datecolumn < CAST(CONCAT($year + 1, '-01-01') AS DATETIME)


SELECT  DISTINCT(DAY(datecolumn))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME)
        AND datecolumn < CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME) + INTERVAL 1 MONTH

Если вы храните то, что PHP time() возвращает в ваших столбцах, используйте это:

SELECT  DISTINCT(YEAR(FROM_UNIXTIME(datecolumn)))
FROM    mytable

SELECT  DISTINCT(MONTH(FROM_UNIXTIME(datecolumn)))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT($year, '-01-01') AS DATETIME)
        AND datecolumn < CAST(CONCAT($year + 1, '-01-01') AS DATETIME)

SELECT  DISTINCT(DAY(FROM_UNIXTIME(datecolumn)))
FROM    mytable
WHERE   datecolumn >= UNIX_TIMESTAMP(CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME))
        AND datecolumn < UNIX_TIMESTAMP(CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME) + INTERVAL 1 MONTH)

Обратите внимание, что здесь используются следующие условия: sargable : datecolumn - единственное, что находится на одной стороне выражения, и для его поиска можно использовать индекс.

1 голос
/ 10 октября 2009

Я думаю, что sql вы хотите ниже. Я проверил эти утверждения на моих данных, которые хранятся как дата mysql, но from_unixtime должен выполнить преобразование, чтобы остальное работало так, как вы хотите.

-- Get year and counts
SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y') AS raw_date,
       DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y') AS format_date,
       COUNT(FROM_UNIXTIME(the_date)) AS num_activities
  FROM date_table
 GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y'),
          DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y');

-- Get month/year and counts     
SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m') AS raw_date,
       DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %Y') AS format_date,
       COUNT(FROM_UNIXTIME(the_date)) AS num_activities
  FROM date_table
 GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m'),
          DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %Y');

-- Get date and counts
SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m%d') AS raw_date,
       DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %d, %Y') AS format_date,
       COUNT(FROM_UNIXTIME(the_date)) AS num_activities
  FROM date_table
 GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m%d'),
          DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %d, %Y');
0 голосов
/ 10 октября 2009

Проверьте функцию извлечения MySQL.

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_extract

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...