根据excel userform中下拉组合框中选定的月份创建一个sql查询

时间:2018-05-04 14:56:12

标签: sql sql-server excel vba

我在excel中有一个用户表单用于考勤报告。在表单上,​​用户选择他们想要查看的员工,然后他们可以选中一个显示年份的框,或者从组合框下拉列表中选择个别月份。这是查询我们的sql服务器上有数据的全部内容。年初至今很简单,因为我知道如何将变量用于当前日期和一年中的第一天。我遇到的问题是如何将用户的月份选择转换为可用的查询。例如:如果用户选择1月作为下拉列表,则查询将为

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 :(得分:1)

假设您的月份是1到12之间的数值,您可以使用类似

的内容
DateSerial

即使在12月也是如此,13接受ADODB.Command作为月份。 请注意,您必须要求&lt;下个月的第一天来捕获该月最后一天的数据。

旁注:我假设您使用ADODB.parameter来查询数据库。我强烈建议您使用match将日期(和代理名称)传递给数据库 - 您不必处理格式化或转换日期,以便数据库正确理解它们。请参阅示例https://stackoverflow.com/posts/10353908/edit以了解其工作原理。

<强>更新 我假设您使用范围中的值填充组合框,并且值链接到单元格。例如使用=MATCH(B1,A1:A12)函数将月份作为数字(我永远不会相信Excel或数据库正确翻译了一个月的名称,有太多的东西,如区域设置可能导致它中断)。 假设:
月份名称范围:A1..A12
链接单元格:B1
将公式resp.headers.get放在单元格B2中。 Voilà,你有月份的数量。

答案 1 :(得分:1)

首先

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

将从1月1日到1月30日选择所有数据,不包括1月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)

答案 2 :(得分:1)

在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