【问题标题】:Second part of where clause in sql/vba hassql/vba 中 where 子句的第二部分有
【发布时间】:2020-04-13 12:42:49
【问题描述】:

我正在使用 vba,将 sql 数据库中的条目组合成 5 分钟范围到 excel 中,我奇怪地注意到下面的代码总是会在大约晚上 9:15(从上午 12:00:0 开始)之前提取条目数据库在(9:15pm)之后有很多条目

我已将其缩小到 WHERE 子句的第二部分 "AND [DateTime]

但只是将 =(没有 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') "

【问题讨论】:

  • dbfiddle 没有显示真正的意外输出,据我所知......

标签: sql sql-server vba


【解决方案1】:

记住三件事

  1. 如果我在您的代码中看到的唯一罕见的事情是“+28”,如果我使用该 +28 进行测试,则结束日期间隔。

结果使您的时间间隔增加了 28 小时,因此晚上 9 点之后它会影响您的查询(增加一天)。

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
  1. 我建议使用介于两个日期之间的小时、分钟和秒

    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 表格中计算并以格式 (YYYY-MM-DD HH: MM: SS) 发送,或者如果它是没有时间的一整天并且在结束日期 +1 时发送

  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 注入验证输入值等于日期和最大长度。

my test data

【讨论】:

  • 啊有趣,是的,我们的想法是抓住包含一天的 24 小时,只有那 24 小时,但你的做法似乎更干净!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多