Как получить последнюю дату месяца, но скрыть воскресенье и субботу в SQL Server - PullRequest
0 голосов
/ 03 июля 2018

Пожалуйста, помогите .. это мой код

 DECLARE @StartDT DATE = '2018-03-01' 
 DECLARE @Tanggal AS DATE = '2018-03-01' 
 DECLARE @EndDT DATE = '2018-03-31' 
 DECLARE @Hari AS INT

 --DECLARE @AkhirBulan AS DATE

 WHILE @StartDT <= @EndDT 
 BEGIN
       SET @Hari = DATEPART(dw,@StartDT)
       --SET @EndDT = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDT)+1,0))

       IF @Hari NOT IN (7,1) 
          AND @EndDT IN (DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @EndDT) + 1, 0)))
       BEGIN    
           IF NOT EXISTS(SELECT * FROM dbo.Holiday 
                         WHERE HolidayDate = @StartDT)
           --IF @EndDT IN (@EndDT)          PRINT CONVERT(VARCHAR,@StartDT)--+'-'+CONVERT(VARCHAR(3),@hari )            --EXEC
 DashboardHistory_Insert @Tanggal, @StartDT 
       END

       SET @StartDT = DATEADD(DAY, 1, @StartDT)
       --SELECT EOMONTH ( @StartDT ) END

Это результат моего сценария

2018-03-01 2018-03-02 2018-03-05 2018-03-06 2018-03-07 2018-03-08 2018-03-09 2018-03-12 2018-03-13 2018-03-14 2018-03-15 2018-03-16 2018-03-19 2018-03-20 2018-03-21 2018-03-22 2018-03-23 2018-03-26 2018-03-27 2018-03-28 2018-03-29 2018-03-30

2018-03-31 <- я хочу получить последний месяц, как этот, но в воскресенье и субботу не отображается </p>

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Гораздо лучший подход к этому состоит в том, чтобы не использовать WHILE для чего-то, что может быть легко достигнуто с помощью метода, основанного на множестве. Использование WHILE или CURSOR обычно является ужасной идеей для чего-то, что может быть полностью выполнено методом, основанным на множествах, поскольку они медленны и плохо масштабируются.

Один из способов сделать это - использовать Tally, а затем построить на нем свой набор данных. Например:

USE Sandbox;
GO

DECLARE @StartDate date, @EndDate date;
SET @StartDate = '20180301';
SET @EndDate = '20180331';

WITH CTE AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) V(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM CTE C1
         CROSS JOIN CTE C2),
Dates AS(
    SELECT DATEADD(DAY,T.I, @StartDate) AS CalendarDate,
           ROW_NUMBER() OVER (ORDER BY T.I DESC) AS Ir
    FROM Tally T
    WHERE T.I <= DATEDIFF(DAY, @StartDate, @EndDate))
SELECT D.CalendarDate,  DATENAME(WEEKDAY,D.CalendarDate) AS CalendarDay
FROM Dates D
WHERE DATENAME(WEEKDAY,D.CalendarDate) NOT IN ('Saturday','Sunday') --Note this is language specific
   OR Ir = 1
ORDER BY D.CalendarDate ASC;
0 голосов
/ 03 июля 2018

Если вы хотите исключить все воскресенья и субботы, кроме случаев, когда это последний день месяца, то приведенный ниже запрос даст вам результат. Пожалуйста, проверьте и измените оператор SELECT соответственно.

DECLARE @StartDT DATE='2018-03-01' 
DECLARE @EndDT DATE='2018-03-31' 

WHILE @StartDT <= @EndDT
BEGIN
    IF (DATEPART(DW,@StartDT) = 1 OR DATEPART(DW,@StartDT) = 7 ) AND (EOMONTH(@StartDT)!= @StartDT)
    BEGIN
        SET @StartDT = DATEADD(D,1,@StartDT)
    END
    ELSE
    BEGIN
        SELECT @StartDT
    END
    SET @StartDT = DATEADD(D,1,@StartDT)
END
...