Вторая часть предложения where в sql / vba имеет - PullRequest
0 голосов
/ 08 апреля 2020

Я использую vba, чтобы объединить записи в базе данных sql в 5-минутные диапазоны в Excel, я странно заметил, что приведенный ниже код будет всегда извлекать записи только примерно до 21:15 (с 12:00 до 0:00). ) Проверяя базу данных, есть много записей после (9:15 вечера)

Я сузил это до второй части предложения WHERE "И [DateTime] <= DateAdd (Hour, DateDiff (Hour, 0, '"& DateYMD &"') +28, 0) ", который, кажется, вообще не работает, выделение или запуск на сервере SQL напрямую не работает </p>

но просто заменив <= на>> (без другой половины запроса where), и он выполнит запрос, как и ожидалось

, поэтому я, очевидно, упускаю что-то простое, но не вижу его, спасибо за помощь : -x

selectCmd.ActiveConnection = adoDbConn
   selectCmd.CommandText = "SELECT DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') as Date_Time " & _
    " ,max(Part_Count)-min(Part_Count) as PartsMade" & _
    ", max(Alarm_Light) as Alarmlight" & _
    ", max(PV_Alarm) as Alarm" & _
    " FROM [SMP].[dbo].[33_TestImport] " & _
    " Where [DateTime]>= DateAdd(Hour, DateDiff(Hour, 0, '" & DateYMD & "')-0, 0) AND [DateTime]<= DateAdd(Hour, DateDiff(Hour, 0, '" & DateYMD & "')+28, 0) " & _
    " AND Machine_Number = " & Machvar & " " & _
    " Group BY DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') "

1 Ответ

0 голосов
/ 09 апреля 2020

Помните о трех вещах

  1. Единственная редкая вещь, которая, если я увижу в вашем коде, это '+28', интервал конечной даты, если я провожу тест с этим + 28.

Результат добавляет к вашему интервалу еще 28 часов, и по этой причине после 21:00 он влияет на ваш запрос (добавьте один день).

declare @dat as datetime=DateAdd(Hour, DateDiff(Hour, 0, '2020-02-15 20:59:00')+28, 0)
declare @dat2 as datetime=DateAdd(Hour, DateDiff(Hour, 0, '2020-02-15 21:00:00')+28, 0)
print (@dat)
print (@dat2)

Результат равен

Feb 17 2020 12:00AM
Feb 17 2020  1:00AM

Я рекомендую использовать между двумя датами с часами, минутами и секундами

select DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') AS INTERVAL,
max(Part_Count),min(Part_Count),max(Alarm_Light) as Alarmlight,max(PV_Alarm) as Alarm 
FROM TestImport
WHERE DateTime between '2020-02-15 21:00:00' AND '2020-02-15 21:20:00'
Group BY DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101')

Дата должна быть рассчитана в листе Excel и отправляется в формате (ГГГГ-ММ-ДД ЧЧ: ММ: СС) или, если это полный день без времени и в дату окончания + 1

Генерирует запрос, заменяя значения и не объединяя строки

Dim Querysql as String
Querysql = " 
select DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5, '20000101') AS INTERVAL,
max(Part_Count),min(Part_Count),max(Alarm_Light) as Alarmlight,max(PV_Alarm) as Alarm FROM TestImport
WHERE DateTime between '${FechaIni}' AND '${FechaFin}'
Group BY DATEADD(MINUTE, (DATEDIFF(MINUTE, '20000101', DateTime) / 5)*5
"
Replace(Querysql, "${FechaIni}", 2020-02-15 21:00:00)
Replace(Querysql, "${FechaFin}", 2020-02-15 21:20:00)

exec comand

Чтобы избежать SQL проверки правильности ввода, значение ввода равно дате и имеет максимальную длину.

мои данные испытаний

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