Maison  >  Questions et réponses  >  le corps du texte

Mysql obtient la date et la plage de dates pour une date spécifique (erreur de syntaxe)

Voici mon code complet, mais quand je le lance,

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME

SET @StartDateTime = '2022-04-01'
SET @EndDateTime = '2022-04-29';

WITH DateRange(Dates, DateWD) AS 
(
    SELECT @StartDateTime as Date, DATEPART(WEEKDAY, @StartDateTime) 
    UNION ALL
    SELECT DATEADD(d,1,Dates), DATEPART(WEEKDAY, DATEADD(d,1,Dates)) 
    FROM DateRange 
    WHERE Dates < @EndDateTime
)

SELECT Dates, DateWD
FROM DateRange 
 WHERE DATEWD NOT IN(1,7) AND Dates NOT IN(
 SELECT (HOLI_YEAR + '-' + HOLI_MONTH + '-' + HOLI_DAY) AS DATE
 FROM TB_HOLIDAY_CODE

OPTION (MAXRECURSION 0)

Cette erreur se produit.

Je souhaite afficher une liste de dates pour avril 2022 (sauf dimanche et samedi)

Par exemple), la date de début est le 01/04/2022 Date de fin 30 avril 2022

Les résultats sont sortis->

Date Date WD
2022-04-01 (vendredi)
2022-04-04 (lundi)
2022-04-05 (mardi)
2022-04-06 (mercredi)
2022-04-07 (jeudi)
2022-04-08 (vendredi)
2022-04-11 (lundi)
.... ...

Comment corriger ce code ? S'il vous plaît aidez-moi. Merci

*** Je ne sais pas utiliser les tableaux. Parce que je n'ai pas de table et que je veux juste utiliser SQL QUERY.

P粉637866931P粉637866931236 Il y a quelques jours269

répondre à tous(1)je répondrai

  • P粉575055974

    P粉5750559742024-02-26 11:23:47

    L'erreur de syntaxe est due au fait que l'exemple a été écrit pour SQL Server, pas pour MySQL. Cela nécessite quelques ajustements pour fonctionner avec MySQL 8.x :

    1. Vous n'avez pas besoin DECLARE 用户定义的变量。只需使用 SET de déclarer et d'attribuer des valeurs de variables

    2. DATEADD() est une fonction SQL Server. L'équivalent MySQL est DATE_ADD(Date,INTERVAL expression unit)

    3. DATEPART(weekday,...) est une fonction SQL Server. Pour MySQL, essayez DAYOFWEEK(date)

    4. Enfin, utilisez des mots-clés RECURSIVE dans CTE. Extrait de Documents :

    SQL

    SET @StartDateTime = '2022-04-01';
    SET @EndDateTime = '2022-04-29';
    
    
    WITH RECURSIVE DateRange(Dates, DateWD) AS 
    (
        SELECT @StartDateTime, DayOfWeek(@StartDateTime) 
        UNION ALL
        SELECT DATE_ADD(Dates, INTERVAL 1 DAY), DayOfWeek(DATE_ADD(Dates, INTERVAL 1 DAY)) 
        FROM  DateRange 
        WHERE Dates < @EndDateTime
    )
    SELECT * 
    FROM   DateRange
    WHERE  DateWDNOT IN(1,7)

    Résultat :

    Date Date WD
    2022-04-01 6
    2022-04-04 2
    2022-04-05 3
    2022-04-06 4
    2022-04-07 5
    2022-04-08 6
    2022-04-11 2
    2022-04-12 3
    2022-04-13 4
    2022-04-14 5
    2022-04-15 6
    2022-04-18 2
    2022-04-19 3
    2022-04-20 4
    2022-04-21 5
    2022-04-22 6
    2022-04-25 2
    2022-04-26 3
    2022-04-27 4
    2022-04-28 5
    2022-04-29 6

    db<>violon ici

    répondre
    0
  • Annulerrépondre