【问题标题】:SQL query in vba by last month down to the second上个月 vba 中的 SQL 查询下降到第二个
【发布时间】:2018-08-21 18:03:48
【问题描述】:

我已经为我的问题寻找解决方案已经有一段时间了,但似乎找不到有效的答案。我有一张表格,其中包含根据日期和案件类型涌入不同律师的案件。请记住,我是 VBA 和 SQL 方面的新手

我想做的事:

我需要根据日期将大量案件分类为每位律师收到的案件数量,在这种情况下,这在上个月重复出现。本质上,我需要能够每个月按下一个按钮,然后自动检索上个月的数据并将其放入 Excel 工作簿中。这一切其实都成功了,除了下面这个问题

问题:

每当我运行宏时,它都不会检索到全部金额。例如,2 月份我知道有 159 个新病例,但公式只找到 155 个。现在我可以得到正确的结果,方法是提示 inputboxstartdateenddate 并输入格式 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 ;")

【问题讨论】:

  • @Ashleedawg。感谢您的评论和时间,但 Peh 的回答解决了这个问题。有关信息,调试显示 01/02/18 和 28/02/18 - 至于丢失记录上的日期,我不知道。需要很长时间才能看完。但它已经解决了 - 再次感谢您的关注:)
  • @Boxx as ashleedawg 指出我的答案不正确,因为我只是查看了您的标准而不是使用我的大脑。请考虑选择他的答案作为解决方案,以便我删除我的。
  • @Pᴇʜ - 谢谢,我的 SQL OCD 在这里发疯了,因为我曾经因为类似的问题花了 对丢失数据和重叠数据进行故障排除。 :-)
  • @ashleedawg 当然你是完全正确的。我只是没有考虑,因为标准已经在他的问题中了。如果错误的东西已经写在纸上,那么这总是一个问题,很容易相信你读到的东西。
  • @ashleedawg - 你是绝对正确的 - 我太快了! :) 这就是您尝试评论并对所有事情做出反应而得到的结果,同时尝试修复您的解决方案我猜。对不起!另一方面 - 现在一切正常! - 您的修复工作非常出色,我得到了正确的数字,同时还考虑了您提出的问题。你是救生员! :) 谢谢!

标签: sql sql-server vba excel


【解决方案1】:

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

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

Year = 2019  Month = 0  Day = 1

显然,这行不通。您不能只是“从月份中减去 1”来始终得到上个月。

此外,您不应将结束时间指定为23:59:59,将开始时间指定为00:00:01,因为您每年会跳过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 ;")

【讨论】:

    【解决方案2】:

    或者,使用DateAdd(),这与@ashleedawg 的观点一致,即EndDate 使用严格小于当前月份的&lt;(在任何年/月中保持一致)。此外,下面使用ADO parameterization 将 SQL 代码与 VBA 数据分开,而不是字符串插值(行业最佳实践)。

    Dim StartDate As Date, EndDate As Date
    Dim strSQL As String
    
    EndDate = DateAdd("d", -Day(Date) + 1, Date)
    StartDate = DateAdd("m", -1, EndDate)
    
    Debug.Print StartDate, EndDate
    
    ' PREPARED STATEMENT
    strSQL = "SELECT [Jurist], [OpretDato], [Tilgang] " & _
             " FROM [dbo].[TilgangOgAfgangAfSagerTilgangIPeriodenView]" & _
             " WHERE [OpretDato] >= ? AND [OpretDato] < ?" & _
             " AND (Jurist NOT IN ('BF','MLT','NL') OR Jurist IS NULL)" & _
             " ORDER BY [Jurist] ASC ;"
    
    ' COMMAND OBJECT (BINDING PARAMETERS)
    With cmd
        .ActiveConnection = conn    ' CONNECTION OBJECT
        .CommandText = strSQL
        .CommandType = adCmdText
    
        .Parameters.Append .CreateParameter("s_param", adDate, adParamInput, , StartDate)
        .Parameters.Append .CreateParameter("e_param", adDate, adParamInput, , EndDate)
    End With
    
    ' BIND TO RECORDSET
    Set rst = cmd.Execute
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2014-12-02
      • 2022-01-13
      • 2015-10-24
      • 1970-01-01
      相关资源
      最近更新 更多