Условие запроса для выбранных високосных лет в MySQL - PullRequest
1 голос
/ 09 июля 2020

У меня есть столбец года в одной из моих таблиц, и мне нужно найти те годы, которые составляют високосный год в MySQL. Имя таблицы - «Mov ie», и у меня есть столбец с конкретным годом и заголовком. Как найти фильмы в високосном году в запросе SQL?

Я написал вышеупомянутый запрос, но в своем ответе получил год «I 2009».

SELECT year, title from Movie where year%4=0 AND (year%100!=0 OR year%400=0)

Глава данные такие:

    title                       Year
0   The Avengers                2012
1   Captain America: Civil War  2016
2   Lion                        2016
3   Slumdog Millionaire         2008
4   2012                      I 2009

Ответы [ 3 ]

2 голосов
/ 09 июля 2020
SELECT @year,
       DAY(CONCAT(@year, '-03-01') - INTERVAL 1 DAY) = 29 AS is_leap;

или

SELECT @year,
       !MOD(@year, 4) - !MOD(@year, 100) + !MOD(@year, 400) AS is_leap;

Соответственно

SELECT year, title 
FROM Movie 
WHERE DAY(CONCAT(year, '-03-01') - INTERVAL 1 DAY) = 29

или

SELECT year, title 
FROM Movie 
WHERE !MOD(year, 4) - !MOD(year, 100) + !MOD(year, 400)
0 голосов
/ 09 июля 2020

Является ли тип данных столбца года символьным? Используя функции ceil и cast, он проверяет, имеет ли он числовой формат.

SELECT year, title from Movie where year%4=0 AND (year%100!=0 OR year%400=0) AND year=cast(ceil(year) as char);

4 2012 I 2009

Это может быть проблема приложения. Если данные «2012», которые соответствуют условиям високосного года, находятся в столбце года, а данные столбца заголовка имеют значение NULL, значит, столбец заголовка смещен и столбец года выводится как он. Если указано выше, я думаю, что «I» - это неправильный вывод данных, относящийся к области за пределами диапазона.

0 голосов
/ 09 июля 2020

Для всех лет, когда есть фильмы, этого достаточно:

where year % 4 = 0 

Более точное выражение:

where (year % 4 = 0 and year % 100 <> 0) or
      (year % 400 = 0)

IN не подходит для этого условия.

...