Как запросить CTE с помощью оператора select с предложением where - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь вернуть все инциденты в течение определенного времени начала и окончания и отправить данные в мое приложение.

Сервер находится в GMT, и большинство пользователей этого приложения находятся в EST, поэтомуЯ делаю конверсию -4 часа с использованием dateadd.

Дело в том, что, скажем, пользователь вводит дату начала и окончания '03 -23-2019 ', запрос вернет инцидент с датойи время '03 -22-2019 9:00 PM '.

Возвращается инцидент за пределами диапазона дат из-за преобразования времени, которое я выполняю во время оператора select.

Этот инцидент, датированный '03 -22-2019 9:00 PM ', фактически находится в этой базе данных как '03 -23-2019 1:00 AM'.

До сих пор я пытался использовать CTE для выполнения первоначального запросаон выполняет преобразование, а затем я пытаюсь запросить в этом CTE дату, соответствующую критериям.

WITH incidents AS (
SELECT dv_u_store as LoginID, convert(varchar(30),dateadd(hh,-4,sys_created_on),22) as Submit_Date,
COALESCE(number,'') as Incident_Number, dv_incident_state as [Status], '' as  Product_Name, 
dv_priority as Priority, dv_short_description as [Summary]
From dbo.incident
WHERE dv_u_store IN ('004188') AND sys_created_on >= '04-23-2019' AND sys_created_on < DATEADD(DAY, 1, '04-26-2019')
)
SELECT *
FROM incidents
WHERE submit_date >= '04-23-2019' AND submit_date < DATEADD(DAY, 1, '04-26-2019')
ORDER BY submit_date DESC

Дата начала: 04-23-2019

Дата окончания: 04-26-2019 + 1 день (04-27-2019)

Так что в этом случае CTE aодинокий возвращает 4 строки:

04/25/19 1:40 AM

04/24/19 4:57 PM

04/23/19 1:40 AM

04/22/19 8:18 PM

Затем у меня есть другой оператор select, ссылающийся на тот CTE, у которого есть предложение WHERE, которое снова передает дату начала и окончания.

Дело в том,этот оператор выбора НЕ отфильтровывает последнюю запись '04-22-19 ', которая находится вне диапазона начальной и конечной дат.

Как запросить CTE с начальной и конечной датами для фильтрациичто-нибудь, что больше не соответствует критериям после этого 4-часового преобразования?

, чтобы оно возвращало только:

04/25/19 1:40 AM

04/24/194:57 PM

04/23/19 1:40 AM

Я также готов сделать лучшее преобразование времени.Мне просто нужно, чтобы время каждого инцидента было в EST, а не в GMT, когда оно возвращается в мое приложение.

РЕДАКТИРОВАТЬ

WITH incidents AS (
SELECT dv_u_store as LoginID, convert(VARCHAR(30), dateadd(hh,-4,sys_created_on), 22) as Submit_Date,
COALESCE(number,'') as Incident_Number, dv_incident_state as [Status], '' as  Product_Name, 
dv_priority as Priority, dv_short_description as [Summary]
From dbo.incident
WHERE dv_u_store IN ('004188') AND sys_created_on >= CAST('04-23-2019' AS datetime) AND sys_created_on < cast(DATEADD(DAY, 1, '04-26-2019') AS datetime)
)
SELECT *
FROM Incidents
WHERE submit_date >= cast('04-23-2019' AS datetime) AND submit_date < cast(DATEADD(DAY, 1, '04-26-2019') AS DATETIME)
ORDER BY submit_date DESC

Как и предполагалосьпо комментариям я изменил конверсии вокруг.Теперь во время предложения where я приводил эти строки как DATETIME.

1 Ответ

0 голосов
/ 06 мая 2019

Возьми это за спин ...

DECLARE
    @begdate DATETIME = '2019-04-23',
    @enddate DATETIME = '2019-04-26';

SELECT 
    @begdate = DATEADD(HOUR, -4, @begdate),
    @enddate = DATEADD(HOUR, 20, @enddate); -- rather than adding a day and adjusting for UTC, just add 20 hours...

SELECT
    LoginID = i.dv_u_store,
    Submit_Date = CONVERT(VARCHAR (30), DATEADD(hh, -4, i.sys_created_on), 22),
    Incident_Number = COALESCE(i.number, ''),
    Status = i.dv_incident_state,
    Product_Name = '',
    Priority = i.dv_priority,
    Summary = i.dv_short_description
FROM
    dbo.incident i
WHERE
    i.dv_u_store IN ('004188')
    AND i.sys_created_on >= @begdate
    AND i.sys_created_on < @enddate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...