Как выбрать только годы из базы данных 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
- единственное, что находится на одной стороне выражения, и для его поиска можно использовать индекс.