web-dev-qa-db-fra.com

Comment puis-je trouver le samedi prochain à MySQL

J'ai une gâchette et une procédure stockée dedans (SO SP exécute lorsque la gâchette fonctionne). J'ai besoin d'une fonction qui trouve le samedi prochain pour mettre en SP.

Disons donc, c'est mercredi (2015-7-22) aujourd'hui. Si ma gâchette fonctionne aujourd'hui, le SP doit-il trouver le samedi prochain (2015-7-25).

De plus, même s'il est samedi, mais le temps est plus tôt de 21h30, il doit également trouver le jour actuel. Après 21h30, il doit retourner le samedi prochain.

J'aimerais bien mettre tout mon déclencheur et ma SP ici, mais je ne veux pas y arriver ici. J'ai juste besoin d'idées, merci.

Edit :

Merci à Onaye, j'ai codé que:

CREATE DEFINER=`root`@`localhost` PROCEDURE `newGuess`(
IN `muserID` INT, 
IN `numm1` INT, 
IN `numm2` INT, 
IN `numm3` INT, 
IN `numm4` INT, 
IN `numm5` INT, 
IN `numm6` INT)
    begin
set @today = (select weekday(curdate())+1); /*monday is the first day in here*/
if @today<6 or @today=7 then /*it is NOT saturday*/
    set @nextSaturday = (SELECT DATE_ADD(NOW(),INTERVAL IF(WEEKDAY(NOW())>=5,(6-WEEKDAY(NOW())),(5-WEEKDAY(NOW()))) DAY));
end if;
if @today = 6 then /* it is saturday */
    set @current_time = (select curtime());
    set @nextSaturday = (SELECT DATE_ADD(NOW(),INTERVAL IF(WEEKDAY(NOW())>=5,(6-WEEKDAY(NOW())),(5-WEEKDAY(NOW()))) DAY));
    if @current_time < CAST('21:30:00' AS time) then
        set @nextSaturday = curdate();
    end if;
    if @current_time >=CAST('21:30:00' AS time) then
        set @nextSaturday = curdate()+INTERVAL 1 WEEK;
    end if;
end if;
insert into guessesTBL (userID,num1,num2,num3,num4,num5,num6,current__datetime,draw_date) values (muserID,numm1,numm2,numm3,numm4,numm5,numm6,NOW(),@nextSaturday);

end

Cela a fonctionné maintenant. Résolu.

6
Who Cares

J'ai une autre variation de la formule garantie de fonctionner (sauf s'il y a une panne de courant)

SET @now = NOW();
SET @nextsat = DATE(DATE(@now) + INTERVAL (5-WEEKDAY(@now)) DAY
    + INTERVAL 570 MINUTE
    + INTERVAL IF((HOUR(@now)*3600+MINUTE(@now)*60+SECOND(@now))>34200,
    IF(WEEKDAY(@now)=5,1,0),0) WEEK);

Au cas où vous vous demandez, 09:30:00 est

  • 570 minutes après minuit
  • 4200 secondes après minuit

Testons cette formule

À L'HEURE ACTUELLE

mysql> SET @now = NOW();
Query OK, 0 rows affected (0.00 sec)

mysql> SET @nextsat = DATE(DATE(@now) + INTERVAL (5-WEEKDAY(@now)) DAY
    ->     + INTERVAL 570 MINUTE
    ->     + INTERVAL IF((HOUR(@now)*3600+MINUTE(@now)*60+SECOND(@now))>34200,
    ->     IF(WEEKDAY(@now)=5,1,0),0) WEEK);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @now,@nextsat;
+---------------------+------------+
| @now                | @nextsat   |
+---------------------+------------+
| 2015-07-22 11:53:33 | 2015-07-25 |
+---------------------+------------+
1 row in set (0.00 sec)

mysql>

Samedi 09h29:59

mysql> SET @now = '2015-07-25 09:29:59';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @nextsat = DATE(DATE(@now) + INTERVAL (5-WEEKDAY(@now)) DAY
    ->     + INTERVAL 570 MINUTE
    ->     + INTERVAL IF((HOUR(@now)*3600+MINUTE(@now)*60+SECOND(@now))>34200,
    ->     IF(WEEKDAY(@now)=5,1,0),0) WEEK);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @now,@nextsat;
+---------------------+------------+
| @now                | @nextsat   |
+---------------------+------------+
| 2015-07-25 09:29:59 | 2015-07-25 |
+---------------------+------------+
1 row in set (0.00 sec)

mysql>

Samedi de 09h30h00

mysql> SET @now = '2015-07-25 09:30:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @nextsat = DATE(DATE(@now) + INTERVAL (5-WEEKDAY(@now)) DAY
    ->     + INTERVAL 570 MINUTE
    ->     + INTERVAL IF((HOUR(@now)*3600+MINUTE(@now)*60+SECOND(@now))>34200,
    ->     IF(WEEKDAY(@now)=5,1,0),0) WEEK);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @now,@nextsat;
+---------------------+------------+
| @now                | @nextsat   |
+---------------------+------------+
| 2015-07-25 09:30:00 | 2015-07-25 |
+---------------------+------------+
1 row in set (0.00 sec)

mysql>

Samedi 09h30:01

mysql> SET @now = '2015-07-25 09:30:01';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @nextsat = DATE(DATE(@now) + INTERVAL (5-WEEKDAY(@now)) DAY
    ->     + INTERVAL 570 MINUTE
    ->     + INTERVAL IF((HOUR(@now)*3600+MINUTE(@now)*60+SECOND(@now))>34200,
    ->     IF(WEEKDAY(@now)=5,1,0),0) WEEK);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @now,@nextsat;
+---------------------+------------+
| @now                | @nextsat   |
+---------------------+------------+
| 2015-07-25 09:30:01 | 2015-08-01 |
+---------------------+------------+
1 row in set (0.00 sec)

mysql>

ESSAIE !!!

4
RolandoMySQLDBA

Pour trouver la prochaine date pour la semaine donnée, utilisez cette requête. Définissez la valeur de la semaine de la semaine souhaitée dans le [~ # ~ ~ ~] theday [~ # ~] variable.

    SET @THEDAY = 1;
SELECT DATE_ADD(NOW(), INTERVAL if( @THEDAY > WEEKDAY(NOW()) , (@THEDAY - WEEKDAY(NOW())) ,  (7 - WEEKDAY(NOW())) + @THEDAY) DAY)

Notez que l'index de la semaine commence de 0 pour lundi ...... 6 pour dimanche

1
yazan

J'ai posté une réponse similaire dans https://stackoverflow.com/questions/43870329/what-is-the-mysql-alternative-a-oracles-next-day-function/51879395#51879395 quel Une solution plus générale à la question posée ici (moins la partie temporelle). La solution ci-dessous vous aidera à accéder à tout jour suivant (dimanche, lundi, mardi, mercredi, jeudi, vendredi ou samedi) similaire à la fonction NEXT_DAY() Fonction à Oracle.

La solution ci-dessous retournera la même date si vous recherchez le lendemain qui correspond à aujourd'hui (par exemple, si vous recherchez samedi prochain et aujourd'hui, vous obtiendrez la date de retour d'aujourd'hui). Votre question ici spécifie également un cas particulier pour après 9h30. Ceci est plus spécifique qui nécessiterait plus de magie, auquel cas je vous recommanderais d'utiliser la réponse de Rolando ou de modifier cette solution pour tenir compte de l'exigence de temps.

Version courte:

Utilisation DAYOFWEEK() Vous pouvez exploiter les valeurs de numéro pour créer une formule fermée qui vous indique combien de jours à ajouter. Vous pouvez ensuite utiliser Date_Ajouter pour vous aider à modifier la date. Il peut y avoir une manière plus propre, mais vous devriez être capable de faire fonctionner une fonction.

Ce qui suit est une formule Excel, que vous utilisez pour vérifier tous les 49 cas d'utilisation: =MOD(MOD(Next-Input, 7)+7,7)

Quelques exemples de la manière dont les calculs Excel peuvent être traduits en SQL:

SELECT (((1-DAYOFWEEK('2018-08-15')) % 7)+7) % 7 AS DaysToAddToGetNextSundayFromWednesday 
FROM dual; -- 4

SELECT DATE_ADD('2018-08-15', INTERVAL (((1-DAYOFWEEK('2018-08-15')) % 7)+7) % 7 DAY) AS NextSundayFromDate 
FROM dual; -- 2018-08-19   

Si vous envisagez d'utiliser ce qui précède, vous voudrez probablement effectuer une fonction ou une procédure stockée.

Version longue:

J'ai rencontré ce problème plusieurs fois au fil des ans. Première fois que j'ai créé une déclaration de cas géante pour les 49 cas. J'ai trouvé que cela rendait les requêtes super grandes et non propres. Je voulais une solution plus propre et plus simple comme une formule fermée. Vous trouverez ci-dessous des détails sur les calculs que j'ai fait pour confirmer la formule ci-dessus fonctionne. J'ai testé cela avec MySQL 5.7 Si vous utilisez MySQL 8.5, on dirait que la fonction est intégrée (référence: http://www.sqlines.com/mysql/how-to/next_day ).

Remarque: Excel ne renvoie pas les résultats négatifs pour MODULUS, où le mySQL fait. C'est pourquoi nous ajoutons 7 et faire un autre module.

DAYOFWEEK()         
Sun     1       
Mon     2       
Tues    3       
Wed     4       
Thur    5       
Fri     6       
Sat     7       

Input   Next    Expected Days to Add    Formula Result
1       1       0                       0
1       2       1                       1
1       3       2                       2
1       4       3                       3
1       5       4                       4
1       6       5                       5
1       7       6                       6
2       1       6                       6
2       2       0                       0
2       3       1                       1
2       4       2                       2
2       5       3                       3
2       6       4                       4
2       7       5                       5
3       1       5                       5
3       2       6                       6
3       3       0                       0
3       4       1                       1
3       5       2                       2
3       6       3                       3
3       7       4                       4
4       1       4                       4
4       2       5                       5
4       3       6                       6
4       4       0                       0
4       5       1                       1
4       6       2                       2
4       7       3                       3
5       1       3                       3
5       2       4                       4
5       3       5                       5
5       4       6                       6
5       5       0                       0
5       6       1                       1
5       7       2                       2
6       1       2                       2
6       2       3                       3
6       3       4                       4
6       4       5                       5
6       5       6                       6
6       6       0                       0
6       7       1                       1
7       1       1                       1
7       2       2                       2
7       3       3                       3
7       4       4                       4
7       5       5                       5
7       6       6                       6
7       7       0                       0
1
VenomFangs