vba中的SQL查询在上个月下降到第二个

时间:2018-03-13 13:00:42

标签: sql sql-server excel vba excel-vba

我已经在很长一段时间内搜索了我的问题的解决方案,但似乎无法找到有效的答案。我有一张表格,根据日期和案例类型向不同的律师提供案件。请记住,在谈到VBA和SQL时,我是一个新手

我想做的事情:

我需要将大量案件分类为每个律师根据日期获得的案件数量,在这种情况下,上个月会重复出现。基本上我需要能够每月按一个按钮,然后自动检索上个月的数据并将其放在Excel工作簿中。除了以下问题外,所有这些都成功了

问题:

每当我运行宏时,它都不会检索全部数量。例如,在二月我知道有159个新案例,但公式只找到155.现在我可以通过提示inputbox获得startdateenddate来获得正确的结果。输入格式DD/MM/YY HH/MM/SS - 但我想删除inputbox部分,因此我不必输入任何内容。代码应该自动进入其肠道的最后一个月。对于2月,它看起来像是从01/02/18 00:00:0128/02/18 23:59:59

我认为问题是因为我目前的公式并没有全程扩展,因此不包括小时,分钟和秒 - 或类似的东西。

我也非常有信心可以使用dateadd函数修复它,我只是不知道如何解决。如何指定StartdateEnddate以包括整个月,直至第一秒和最后一秒?

可能是一个非常简单的解决方案,但它超越了我

代码:

Dim Startdate As Date
Dim Enddate As Date

Startdate = DateSerial(Year(Now), Month(Now) - 1, 1)
Enddate = DateSerial(Year(Now), Month(Now), 0)

Debug.Print Startdate, Enddate

Set rs = conn.Execute("Select [Jurist], [OpretDato], [Tilgang] From [dbo].[TilgangOgAfgangAfSagerTilgangIPeriodenView]" & _
"Where [OpretDato] Between '" & Startdate & "' And '" & Enddate & "' and (Jurist not in ('BF','MLT','NL') or Jurist is null)" & _
"Order by [Jurist] ASC ;")

2 个答案:

答案 0 :(得分:4)

您的四条记录可能在最后一天丢失,因为2月28日2018-02-28 = 2018-02-28 00:00:00 =午夜开始

你的公式的另一个问题:想想2019年1月会发生什么......你的公式(以及其他答案)将会返回:

Year = 2019  Month = 0  Day = 1

显然,这不起作用。你不能只是“从月中减1”来持续获得前一个月。

此外,您不应指定23:59:59的结束时间和00:00:01的开始时间,因为您每年都会跳过 12分钟 < / strong> ...以及 12月份

这是处理“上个月”标准的正确方法:

EndDate = DateSerial(Year(Now), Month(Now), 1)
StartDate = DateSerial(Year(EndDate - 1), Month(EndDate - 1), 1)

然后您的SQL条件为:

WHERE ([RecordDateTime] >= StartDate And [RecordDateTime] < EndDate)

注意=未包含在标准的后半部分中。

您调整后的代码:

Set rs = conn.Execute("Select [Jurist], [OpretDato], [Tilgang] " & _
    "From [dbo].[TilgangOgAfgangAfSagerTilgangIPeriodenView]" & _
    "Where [OpretDato] >= '" & Startdate & "' And [OpretDato] < '" & _
    Enddate & "' and (Jurist not in ('BF','MLT','NL') or Jurist is null)" & _
    "Order by [Jurist] ASC ;")

答案 1 :(得分:2)

或者,使用PIPENV_IGNORE_VIRTUALENVS符合@ ashleedawg使用严格较少的source ~/some/virtualenv/location/bin/activate PIPENV_IGNORE_VIRTUALENVS=1 pipenv install ,而不是当前月份 EndDate (任何年/月都一致)。此外,下面使用ADO parameterization将SQL代码与VBA数据分开,而不是字符串插值(行业最佳实践)。

DateAdd()