Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

mysql mengonversi tanggal ke tanggal yang sama tahun ini

Jawaban Khalid sebagian besar benar. Tahun kabisat mengacaukan segalanya! Jika Anda menjalankan kueri yang diusulkan dengan nilai datecol '2016-02-29' dan CURRENT_DATE adalah '01-01-2017', misalnya, Anda mendapatkan null .

Cara alternatif untuk menangani tahun kabisat dengan lebih anggun adalah seperti ini:

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

Nilai date ini adalah 01-03-2017.

Sunting/klarifikasi:Masalahnya adalah mengubah tahun '2016-02-29' ke 2017, misalnya, menghasilkan '2017-02-29', yang bukan tanggal yang valid. Kemudian, menjalankan DATE_FORMAT('2017-02-29', '%Y-%m-%d') menghasilkan null . Demo masalahnya ada di sini:

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

Namun, setelah meninjau jawaban saya, saya menyadari bahwa saya masalah lain dengan menggunakan MAKEDATE karena tanggal apa pun pada tahun kabisat setelah 28 Februari adalah hari +1 untuk tahun "normal" dengan 365 hari. Misalnya, jika datecol ='2016-03-01' dan tahun berjalan adalah 2017 maka tanggal yang dikonversi menjadi '03-02-2017', bukan '03-01' seperti yang diinginkan. Pendekatan yang lebih baik adalah sebagai berikut:

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

Metode ini mengubah 29 Februari menjadi 28, dan jika tidak, semua tanggal lainnya tetap persis seperti yang Anda harapkan. Demo solusinya ada di sini:

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. kesalahan fatal 'stdio.h' Python 2.7.3 di Mac OS X 10.7.5

  2. PHP MySQL Diurutkan berdasarkan beberapa kolom

  3. Pendekatan sharding MySQL?

  4. meningkatkan kueri artikel terkait MySQL

  5. pertanyaan pembatas mysql