Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql преобразува датата в същата дата на текущата година

Отговорът на Халид е правилен през повечето време. Високосната година обърква нещата! Ако изпълните предложената заявка, където стойността на datecol е '2016-02-29' и CURRENT_DATE е '2017-01-01', например, получавате null .

Алтернативен начин да направите това, който обработва високосната година по-елегантно, е като този:

SELECT DATE_FORMAT(
    MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
    '%Y-%m-%d'
) `date`
FROM t

Стойността на date тук ще бъде 2017-03-01.

Редактиране/разяснение:Проблемът е, че промяната на годината от „2016-02-29“ на 2017, например, произвежда „2017-02-29“, което не е валидна дата. След това изпълнението на DATE_FORMAT('2017-02-29', '%Y-%m-%d') води до null . Демонстрация на проблема е тук:

http://sqlfiddle.com/#!9/c5358/11

Въпреки това, след като прегледах отговора си, осъзнах, че имам друг проблем, като използвам MAKEDATE, тъй като всяка дата на високосна година след 28 февруари е дни+1 за "нормална" година с 365 дни. Например, ако datecol ='2016-03-01' и текущата година е 2017, тогава преобразуваната дата ще бъде '2017-03-02', а не '2017-03-01', както желаете. По-добър подход е следният:

SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;

Този метод превръща всеки 29 февруари в 28-ми и в противен случай запазва всички други дати точно както бихте очаквали. Демонстрация на решението е тук:

http://sqlfiddle.com/#!9/c5358/12



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. laravel 4 - как да ограничите (вземете и пропуснете) за Eloquent ORM?

  2. mysqli връзката не работи във функцията?

  3. MySQL пропуска първия ред

  4. вътрешно присъединяване изберете (A,B) на A и B срещу където (A,B) в select(A, B) в mysql

  5. Не мога да намеря грешката в моя php скрипт