Февраль пришел и сломал мой sql. Я получаю сгенерированный файл CSV, который в основном является дампом из базы данных MS Access. У меня нет возможности изменять базу данных. Я использую PHP для выполнения запросов к файлам CSV, чтобы генерировать отчеты для босса. Вот запросы, которые я пытался выполнить (номер 1 работал до февраля):
1)
SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND [Date/Time Taken] BETWEEN #05/01/2016# AND #05/07/2016# AND NOT [Order Status Surrogate #] = 3
2)
SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND Format([Date/Time Taken], 'MM/dd/yyyy') BETWEEN #05/01/2016# AND #05/07/2016# AND NOT [Order Status Surrogate #] = 3
3)
SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND Format([Date/Time Taken], 'mm/dd/yyyy hh:nn:ss') BETWEEN #05/01/2016 00:00:00# AND #05/07/2016 23:59:59# AND NOT [Order Status Surrogate #] = 3
Когда я запускаю запрос 1, я не получаю результатов; в то время как 2 & 3 вернуть все. Если я запускаю запрос 2 в течение одного дня, он возвращает правильные результаты. В запросе есть 71 запись за период времени.
Каков будет правильный способ запроса дат и отображения правильных результатов?
Последний бит информации:
'Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq='.$file.';Extensions=asc,csv,tab,txt;Extended Properties="Excel 8.0;IMEX=1"'
Вы сообщили, что водитель видит ваш [Date/Time Taken]
поле как дата / время тип данных.
Таким образом, вы не должны использовать Format()
функция при сравнении его со значениями даты / времени. Format()
возвращает строку, а не значение даты / времени.
Доступ будет интерпретировать #05/01/2016#
означать 1 мая. Если вы действительно хотите, чтобы это означало 5 января, используйте #2016-01-05#
чтобы избежать путаницы в том, какой кусок месяц, а какой день.
С обоими этими предложениями, используйте условие как это в вашем WHERE
пункты …
[Date/Time Taken] BETWEEN #2016-01-05# AND #2016-07-05#
Или если я не угадала насчет дат …
[Date/Time Taken] BETWEEN #2016-05-01# AND #2016-05-07#
Других решений пока нет …