Я пытаюсь вернуть все инциденты в течение определенного времени начала и окончания и отправить данные в мое приложение.
Сервер находится в 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.