sql >> Base de Datos >  >> RDS >> Mysql

Eventos que se repiten el enésimo día de la semana de cada mes

Aquí hay una posible alternativa para usted. strtotime es poderoso, y la sintaxis incluye bits realmente útiles como redacción integral de fecha y hora relativa .

Puede usarlo para generar del primero al enésimo días de la semana específicos de un mes específico usando el formato " de ". Aquí hay un ejemplo usando date_create para invocar un DateTime objeto, pero strtotime normal y antiguo funciona de la misma manera:

php > $d = date_create('Last Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 25 2011 00:00:00
php > $d = date_create('First Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 04 2011 00:00:00
php > $d = date_create('First Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 06 2011 00:00:00
php > $d = date_create('Fourth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00
php > $d = date_create('Last Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00

También se desbordará el mes, si solicita uno inválido:

php > $d = date_create('Ninth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday May 01 2011 00:00:00

Tenga en cuenta que solo funciona con el número ordinal fraseología. Desafortunadamente, no puede pasar "1º" o "3º".

Una vez que use esto para obtener el enésimo día de la semana adecuado, puede simplemente agregar la cantidad de días de la semana necesarios para omitir (7 para una semana, 14 para dos, 21 para tres, etc.) según sea necesario hasta la fecha de finalización designada o la cantidad designada de han pasado semanas. Una vez más, strtotime al rescate, usando el segundo argumento para encadenar la relación:

php > echo date('l F d Y H:i:s', strtotime('+14 days', strtotime('First Thursday of March 2011')));
Thursday March 17 2011 00:00:00

(Mi copia local también aceptó '+14 days First Thursday of March 2011' , pero eso se sintió un poco extraño).