【问题标题】:SQL/VBA - if/then/else for day of year when recordset has Leap Years and non Leap YearsSQL/VBA - if/then/else 记录集有闰年和非闰年时的一年中的某一天
【发布时间】:2017-07-25 12:25:04
【问题描述】:

早安,

这是我的问题。我有一个表单,用户可以在其中选择他们想要使用的日期。从那里,在 vba 中,我将输入的日期存储在变量 (ytdDate) 中,然后将该日期的年份存储为变量 (dayOfYear)。然后将这些变量值用于以下 sql 语句:

    sqlYTDCounts = "SELECT Count(x.event_unique_id) AS total, 
                    Year(occurrence_date) AS year " & _
                   "FROM (SELECT DISTINCT event_unique_id, occurrence_date 
                    FROM events WHERE datepart('y',occurrence_date) <=" & 
                    dayOfYear & _
                    ")  AS x GROUP BY Year(occurrence_date) HAVING 
                    (((Year([occurrence_date]))>='" & _
                    DatePart("YYYY", ytdDate) - 10 & "') )"

所以基本上正在发生的事情是检索一个记录集,其中每个 [occurrence_date] 的一年中的日期

sql 工作得很好,但仅适用于非闰年,对于所有闰年,它实际上是从用户选择的日期获取前一年中的一天。举个例子:

用户选择 2017 年 7 月 23 日

dayOfYear = 204

但是对于闰年,7 月 23 日是一年中的第 205 天。

在我看来,解决方案似乎很简单:从记录集中检查发生的年份是否是这些年份中的任何一个(2004、2008、2012、2016),以及发生年份的日期是否为该事件> = 60(原因是我不能只检查它是否是闰年,因为 LY 和 NonLY 一年中的同一天直到 60)。

如果满足这两个条件,则 sql 语句的

如果不满足任何条件,则 sql 语句将保持原样。

现在,如何将其转换为 VBA 是我遇到的问题。我曾尝试将 IF THEN ELSE 语句与 sql 语句一起使用,但没有奏效(我很确定我做的不正确)=]

如果这非常令人费解并且没有任何意义,我真的很抱歉,但是非常感谢任何和所有输入/建议/帮助。

谢谢, 标记

【问题讨论】:

  • 你为什么要关心一年中的哪一天?为什么不使用WHERE occurrence_date BETWEEN DateSerial(Year(ytdDate), 1, 1) AND ytdDate
  • 为什么不只查询每年的最新日期而不是计算天数呢?如果你使用 DateAdd("yyyy",-1,occurrence_date) 它会给你一年前的日期?
  • @BaconBits 感谢您的意见。我现在就试试。
  • @MintyThanks 芽。我会在尝试 BaconBits 建议后尝试。
  • @BaconBits 当我尝试它时,我收到以下错误:查询表达式'occurrence_date BETWEEN 2017.01.01 and 2017.07.2'中的数字语法错误由于某种原因,最后一位数字被切断了。

标签: sql vba ms-access


【解决方案1】:

使用 DateAdd 试试这个方法,它总是能正确处理闰年:

sqlYTDCounts = _
    "SELECT Count(*) AS total, Year(occurrence_date) AS year " & _
    "FROM " & _
    "    (SELECT DISTINCT event_unique_id, occurrence_date " & _
    "    FROM events " _
    "    WHERE DateDiff('d', DateAdd('yyyy', " & Year(ytdDate) & " - Year(occurrence_date), occurrence_date), occurrence_date) <= 0) AS x " & _ 
    "GROUP BY Year(occurrence_date) " & _
    "HAVING Year([occurrence_date]) >= " & Year(ytdDate) & " - 10)"

编辑2:

sqlYTDCounts = _
    "SELECT Count(*) AS total, Year(occurrence_date) AS year " & _
    "FROM " & _
    "    (SELECT DISTINCT event_unique_id, occurrence_date " & _
    "    FROM events " & _
    "    WHERE DateDiff('d', DateAdd('yyyy', " & Year(ytdDate) & " - Year(occurrence_date), occurrence_date), #" & Format(ytdDate, "yyyy\/mm\/dd") & "#) >= 0) AS x " & _ 
    "GROUP BY Year(occurrence_date) " & _
    "HAVING Year([occurrence_date]) >= " & Year(ytdDate) & " - 10"

【讨论】:

  • 谢谢@Gustav 我把你的方法放进去,它确实会产生计数,但它们还差得很远(我可以使用 php(用于仪表板)正确运行查询)。当前年份数很好,但是所有其他年份都是应有的两倍。我只想计算不同的 event_unique_id
  • 对不起@Gustav,我试图编辑我的回复,但它不允许我这样做。无论如何,我发现计数关闭的原因是因为查询是在全年进行的,而不是 YTD。所以每年都有它的年度总数。有没有办法确保它只持续到年初至今?谢谢
  • 听起来不错。它应该与ytdDate 进行比较...查看编辑后的答案。
  • 感谢编辑的答案。我在“FROM events”行的下划线之前添加了缺少的 & 符号。但是,当我使用编辑后的版本运行它时,它会出现错误“无效的 SQL 语句:预期的'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'或'UPDATE'。
  • 我已经更正了代码。似乎是有效的,所以请打印出生成的 SQL 供我们查看。它在这里运行得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多