Почему записи не получают пикеты на дату въезда? - PullRequest
1 голос
/ 10 июня 2019

Я написал этот запрос давно, и он работал, но сейчас это не так.

CREATE PROCEDURE [dbo].[WeeklyReport]
AS
BEGIN
    CREATE TABLE #temp
        (
            Area VARCHAR(20),
            NoOfInspec INT
        )

    INSERT INTO #temp
        SELECT DISTINCT
            Area, COUNT(*) AS NoOfInsp 
        FROM 
            EngineeringData E, PIRTaskList T
        WHERE
            E.EnggDataID = t.EnggDataID 
            AND T.NextInspDate BETWEEN (DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), GETDATE()))
                                   AND (DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), GETDATE()))
        GROUP BY
            Area

    SELECT
        t.Area, t.NoOfInspec AS Planned, SecTable.NoOfInsp AS Executed 
    FROM
        #temp t
    INNER JOIN
        (SELECT DISTINCT
             Area, COUNT(*) AS NoOfInsp  
         FROM
             tblScheduleHistory 
         WHERE
             EntryDate BETWEEN (DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), GETDATE()))
                           AND (DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), GETDATE()))    
        GROUP BY
            Area) SecTable ON SecTable.Area = t.Area
    ORDER BY 
        t.Area
END

Даты entrydate против нескольких записей

2019-10-06
2019-09-06
2019-11-06

Требуется выбрать записи за целую неделю, если существует 1 дата, поэтому целая неделя для этого.

Ответы [ 2 ]

1 голос
/ 16 июня 2019

DATEPART(WEEKDAY, GETDATE()) зависит от опции SET DATEFIRST, которая также изменяется с помощью SET LANGUAGE.Язык по умолчанию также можно настроить на уровне сервера, используя sp_configure.

Например, попробуйте следующее, чтобы увидеть разные результаты:

DECLARE @CurrentDate DATE='2019-06-16'

SET LANGUAGE ENGLISH
SELECT  DATEPART(WEEKDAY, @CurrentDate), 
        DATEADD(DAY, 1 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate), 
        DATEADD(DAY, 7 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22

SET LANGUAGE BRITISH
SELECT  DATEPART(WEEKDAY, @CurrentDate), 
        DATEADD(DAY, 1 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate), 
        DATEADD(DAY, 7 - DATEPART(WEEKDAY, @CurrentDate), @CurrentDate)
-- returns 7, 2019-06-10, 2019-06-16

Чтобы код работал одинаково, независимо от опции SET DATEFIRST, вы можете добавить @@DATEFIRSTследующим образом:

DECLARE @CurrentDate DATE='2019-06-16'

SET LANGUAGE ENGLISH

SELECT  (@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1,
        DATEADD(DAY, 1 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate), 
        DATEADD(DAY, 7 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22

SET LANGUAGE BRITISH

SELECT  (@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1,
        DATEADD(DAY, 1 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate), 
        DATEADD(DAY, 7 - ((@@DATEFIRST-1 + DATEPART(WEEKDAY, @CurrentDate))%7+1), @CurrentDate)
-- returns 1, 2019-06-16, 2019-06-22
0 голосов
/ 17 июня 2019

Спасибо @Razvan Socol за понимание.

Я попытаюсь прояснить суть проблемы, которую воспринимают и Разваб, и я.

Код в конце повторяетнабор дат, выводящий вычисленные нижнюю и верхнюю границы в пределах недели даты.

@ Решение Razvan Socol может быть переписано как

DECLARE @dt date = '20190610'

-- Week starts on sundays
PRINT dateadd(dd, 0 - (datepart(weekday, @dt) + @@datefirst - 1) % 7, @dt)
PRINT dateadd(dd, 6 - (datepart(weekday, @dt) + @@datefirst - 1) % 7, @dt)

-- Week starts on mondays
PRINT dateadd(dd, 0 - (datepart(weekday, @dt) + @@datefirst - 2) % 7, @dt)
PRINT dateadd(dd, 6 - (datepart(weekday, @dt) + @@datefirst - 2) % 7, @dt)

Здесь следует весь POC.

SET DATEFIRST 4

DECLARE @datefirst int = 7 -- 1 weeks start on mondays, 7 weeks start on sundays
DECLARE @dtStart date = '20190605'
DECLARE @dtEnd   date = '20190619'

DECLARE @result table(
    dt varchar(255),
    deltaL int, deltaH int,
    boundaryL varchar(255), boundaryH varchar(255)
)

DECLARE @deltaL    int,  @deltaH     int
DECLARE @boundaryL date, @boundaryH  date

WHILE @dtStart <= @dtEnd
BEGIN
    -- Computes DATEPART as ISO 8601, where Monday == 1,
    -- adjusting to @dateFirst
    DECLARE @iso8601 int =
        (
            datepart(weekday, @dtStart) - /* shifted to base 0 */ 1 + 
            @@datefirst                 - /* shifted to base 0 */ 1 +
            --
            (7 - @datefirst + 1) -- Shifted for @datefirst
        ) % 7 + 1

    SET @deltaL = 1 - @iso8601
    SET @deltaH = 7 - @iso8601
    --
    SET @boundaryL = dateadd(dd, @deltaL, @dtStart)
    SET @boundaryH = dateadd(dd, @deltaH, @dtStart)

    INSERT INTO @result
    VALUES(
        convert(varchar, @dtStart, 120) + ' ' + datename(weekday, @dtStart),
        @deltaL, @deltaH,
        convert(varchar, @boundaryL, 120) + ' ' + datename(weekday, @boundaryL),
        convert(varchar, @boundaryH, 120) + ' ' + datename(weekday, @boundaryH)
    )

    SET @dtStart = dateadd(dd, 1, @dtStart)
END

SELECT * FROM @result
...