Rumah  >  Soal Jawab  >  teks badan

Mysql mendapatkan tarikh dan julat tarikh untuk tarikh tertentu (ralat sintaks)

Ini adalah kod lengkap saya, tetapi apabila saya melancarkannya,

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)

Ralat ini berlaku.

Saya ingin menunjukkan senarai tarikh untuk April 2022 (kecuali Ahad dan Sabtu)

Sebagai contoh) tarikh mula ialah 2022-04-01 Tarikh tamat 30 April 2022

Hasilnya keluar->

Tarikh Tarikh WD
2022-04-01 (Jumaat)
2022-04-04 (Isnin)
2022-04-05 (Selasa)
2022-04-06 (Rabu)
2022-04-07 (Khamis)
2022-04-08 (Jumaat)
2022-04-11 (Isnin)
.... ...

Bagaimana untuk membetulkan kod ini? tolong saya. Terima kasih

*** Saya tidak tahu cara menggunakan borang. Kerana saya tidak mempunyai jadual dan saya hanya mahu menggunakan SQL QUERY.

P粉637866931P粉637866931236 hari yang lalu270

membalas semua(1)saya akan balas

  • P粉575055974

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

    Ralat sintaks adalah kerana contoh ditulis untuk SQL Server, bukan MySQL. Ia memerlukan sedikit pengubahsuaian untuk berfungsi dengan MySQL 8.x:

    1. Anda tidak perlu DECLARE 用户定义的变量。只需使用 SET untuk mengisytiharkan dan menetapkan nilai berubah

    2. DATEADD() ialah fungsi SQL Server. Setara dengan MySQL ialah DATE_ADD(Tarikh, unit ekspresi INTERVAL)

    3. DATEPART(weekday,...) ialah fungsi SQL Server. Untuk MySQL, cuba DAYOFWEEK(tarikh)

    4. Akhir sekali, gunakan kata kunci RECURSIVE dalam CTE. Daripada Dokumen:

    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)

    Hasil:

    Tarikh Tarikh 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<>fiddle sini

    balas
    0
  • Batalbalas