Почему он возвращает дату, которая не находится в диапазоне? - PullRequest
0 голосов
/ 25 июня 2019

Я хочу отображать данные только в период с 15 по 23 мая 2019 года. Но почему он также возвращает данные, которые не находятся в диапазоне дат?

Ниже мой запрос

SELECT Appointment_ID, 
     WO_DespatchName, Despatch_Name AS WO_selectDespatchName,
     FORMAT(Appointment_DateTime, 'dd/MMM/yyyy hh:mm tt') AS Appointment_DateTime, 
     FORMAT(Appointment_ProposalSent, 'dd/MMM/yyyy') AS Appointment_ProposalSent,
     WO_MaidName, Maid_Name AS WO_selectMaidName,
     Appointment_Location, Appointment_FaceToFace, Appointment_Service, Appointment_Remarks, WO_Duration,
     Appointment_ContactID, Contact_Name AS Appointment_selectContactID
     FROM Appointments A
     LEFT JOIN Despatch ON Despatch_ID = WO_DespatchName 
     LEFT JOIN CustomerDetails ON Contact_ID = Appointment_ContactID 
     LEFT JOIN Maid ON Maid_ID = WO_MaidName 
     WHERE FORMAT(Appointment_DateTime, 'dd/MM/yyyy') BETWEEN '15/05/2019' AND '23/05/2019'
     AND (A.IsDelete = 0 OR A.IsDelete IS NULL)
     ORDER BY CONVERT(DateTime, Appointment_DateTime,101)  ASC

Вывод, который я получаю, это https://drive.google.com/file/d/1VnrSET1V1eoFvEUUtRwXtQmKGWamURgV/view?usp=sharing

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Проблема в вашем предложении where.Поскольку ваш Appointment_DateTime в формате datetime.Я ожидаю, что этот столбец имеет тип значения datetime.Теперь перейдем к вашему запросу, '23/05/2019' - простая строка, поэтому невозможно сравнить ее с датой и временем.Сначала вам нужно преобразовать дату и дату в формат datetime.

Пожалуйста, попробуйте это (если вас интересует только соответствие даты):

    SELECT Appointment_ID, 
         WO_DespatchName, Despatch_Name AS WO_selectDespatchName,
         FORMAT(Appointment_DateTime, 'dd/MMM/yyyy hh:mm tt') AS Appointment_DateTime, 
         FORMAT(Appointment_ProposalSent, 'dd/MMM/yyyy') AS Appointment_ProposalSent,
         WO_MaidName, Maid_Name AS WO_selectMaidName,
         Appointment_Location, Appointment_FaceToFace, Appointment_Service, Appointment_Remarks, WO_Duration,
         Appointment_ContactID, Contact_Name AS Appointment_selectContactID
         FROM Appointments A
         LEFT JOIN Despatch ON Despatch_ID = WO_DespatchName 
         LEFT JOIN CustomerDetails ON Contact_ID = Appointment_ContactID 
         LEFT JOIN Maid ON Maid_ID = WO_MaidName 
         WHERE FORMAT(Appointment_DateTime, 'dd/MM/yyyy') BETWEEN FORMAT('15/05/2019', 'dd/MM/yyyy') AND FORMAT('23/05/2019', 'dd/MM/yyyy') 
         AND (A.IsDelete = 0 OR A.IsDelete IS NULL)
         ORDER BY CONVERT(DateTime, Appointment_DateTime,101)  ASC

Или вы можете попробовать convert чтобы преобразовать вашу строку в datetime формат.

Не стесняйтесь просить о дальнейшей путанице.

0 голосов
/ 25 июня 2019

Вы сравниваете тексты, а не даты.Таким образом, он вернет любую строку, где дата, преобразованная в строку, начинается между 15 и 23. Вам нужно использовать тип данных даты в своем сравнении:

 WHERE Appointment_DateTime >= CAST('20190515' AS date) AND Appointment_DateTime < CAST('20190524' AS date)

Обратите внимание, что я добавил один день в конечный диапазон, поэтому 05 /23/2019 11: 59: 59.9 ... ПМ все равно будет принят.CAST как дата не обязательна, но улучшает читабельность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...