sql >> Database >  >> RDS >> Mysql

Mysql Dayofyear in schrikkeljaar

Waar NOW() is een niet-schrikkeljaar 2011 , het probleem ontstaat doordat iedereen die in een schrikkeljaar na 29 februari is geboren, een extra dag krijgt omdat je DAYOFYEAR gebruikt tegen het geboortejaar.

DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91

Waar je doet DAYOFYEAR , je hebt de geboortedatum van het huidige jaar nodig, niet het geboortejaar.

Dus in plaats van:

DAYOFYEAR(e.birthdate)

Je kunt het als volgt naar dit jaar converteren:

DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR))

Wat een geboortedatum converteert van:

'2004-04-01'

Aan:

'2011-04-01'

Dus, hier is de aangepaste zoekopdracht:

SELECT      e.id,
             e.title,
             e.birthdate
 FROM        employers e
 WHERE       DAYOFYEAR(curdate()) <= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))
 AND         DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR))

Mensen geboren op 29 februari vallen op 1 maart op niet-schrikkeljaren, wat nog steeds dag 60 is .



  1. Oracle WITH en MATERIALIZE hint fungeert als autonome transactie voor functies

  2. LISTAGG() Functie in Oracle

  3. ON DELETE CASCADE werkt niet in MySQL

  4. BREKEND NIEUWS:Nieuwe Microsoft SQL Server Native Client 18 uitgebracht!