Создать SQL-запрос на основе выбранного месяца из выпадающего списка в Excel пользовательской форме - PullRequest
0 голосов
/ 04 мая 2018

У меня есть пользовательская форма в Excel для отчетов о посещаемости. В форме пользователь выбирает сотрудника, которого он хочет просмотреть, и затем он может установить флажок с указанием года до даты или выбрать отдельные месяцы из выпадающего списка. Это все, чтобы запросить наш sql-сервер, на котором есть данные. Год до даты легко, потому что я знаю, как использовать переменные для текущей даты и первого дня года. У меня проблемы с тем, как преобразовать выбор месяца пользователя в полезный запрос. Например: если пользователь выберет январь для выпадающего списка, запрос будет

select * from [dbo.mytablename]
where [agent name] = '<value from a textbox that I know how to pass in>'
and [cal date] > '1/1/2018' and [cal date] < '1/31/2018'

В настоящее время моя единственная идея состоит в том, чтобы в рабочей таблице были ячейки, содержащие первый и последний день каждого месяца, а затем использовать значения ячеек. Но я бы хотел этого избежать, если это возможно. Если у вас есть идеи, это было бы здорово!

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Прежде всего

and [cal date] > '1/1/2018' and [cal date] < '1/31/2018'

выберет все данные с 1 января по 30 января и не будет включать никаких данных с 31 января.

Учитывая это, чек должен быть

and [cal date] > '1/1/2018' and [cal date] < '2/1/2018'

Так что, если вы получите месяц от выпадающего списка, вы можете сделать что-то вроде ниже

select * from [dbo.mytablename] t
join
(values 
('Jan', 1),('Feb',2),('Mar', 3),
('Apr', 4),('May',5),('Jun', 6),
('Jul', 7),('Aug',8),('Sep', 9),
('Oct', 10),('Nov',11),('Dec', 12)
)v(mon,num)
on v.mon='<month name received from a text box>'
t.[agent name] = '<value from a textbox that I know how to pass in>'
and t.[cal date] > cast(cast(v.num as varchar)+'/1/2018'  as date)
and t.[cal date] < cast(cast((v.num+1)%12 as varchar)+'/1/'+ cast(2018+ (v.num/12) as varchar) as date)
0 голосов
/ 04 мая 2018

В SQL Server существует множество методов для вычисления даты / передачи. Если 2012+, вы можете использовать EOMonth() или DateFromParts().

Я также должен добавить [cal date] < '1/31/2018' должно быть [cal date] <= '1/31/2018'

Пример

Select StrCast1   = try_convert(date,concat('January',' 1, ',2018))
      ,StrCast2   = EOMonth(try_convert(date,concat('January',' 1, ',2018)))
      ,FromParts1 = DateFromParts(2018,1,1)
      ,FromParts2 = EOMonth(DateFromParts(2018,1,1))

Возвращает

StrCast1    StrCast2    FromParts1  FromParts2
2018-01-01  2018-01-31  2018-01-01  2018-01-31
0 голосов
/ 04 мая 2018

Если ваш месяц представляет собой числовое значение от 1 до 12, вы можете использовать что-то вроде

Dim fromDate As Date, toDate As Date

fromDate = DateSerial(2018, month, 1)
toDate = DateSerial(2018, month + 1, 1)
Debug.Print fromDate, toDate

Это будет работать даже с декабря, DateSerial принимает 13 в качестве месяца. Обратите внимание, что вы должны запросить <первый день следующего месяца </em>, чтобы получить данные за последний день месяца.

Примечание: я предполагаю, что вы используете ADODB.Command для запроса базы данных. Я настоятельно рекомендую вам использовать ADODB.parameter для передачи дат (и имени агента) в базу данных - вам не нужно иметь дело с форматированием или преобразованием дат, чтобы база данных понимала их правильно. См. Например https://stackoverflow.com/posts/10353908/edit, чтобы понять, как это работает.

Обновление Я предполагаю, что вы заполняете поле со списком значениями из диапазона, и значение связано с ячейкой. Используйте, например, функцию match, чтобы получить месяц в виде числа (я бы никогда не поверил, что название месяца правильно переведено Excel или базой данных, слишком много таких вещей, как региональные настройки, которые могут привести к его поломке). Предполагая, что:
Диапазон с названиями месяцев: A1..A12
Связанная ячейка: B1
Поместите формулу =MATCH(B1,A1:A12) в ячейку B2. Вуаля, у вас есть номер месяца.

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