SQL / VBA - if / then / else一年中记录集具有闰年和非闰年的日期

时间:2017-07-25 12:25:04

标签: sql vba ms-access

早上好,

这是我的问题。我有一个表单,用户可以选择他们想要使用的日期。从那里,在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]的日期是&lt; =用户在表单上选择的日期之后的一年中的日期。

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

用户选择7月23,2017

dayOfYear = 204

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

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

如果满足这两个条件,那么sql语句的&lt; =“&amp; dayOfYear&amp; _部分将是&lt; =”&amp; (dayOfYear + 1)&amp; _

如果符合非条件,那么sql语句将保持不变。

现在,如何将其转换为VBA是我陷入困境的地方。我已经尝试使用带有sql语句的IF THEN ELSE语句,但是没有用(我很确定我没有正确执行)=]

如果这是非常复杂且没有任何意义,我真的很抱歉,但是任何和所有的输入/建议/帮助都非常感激。

谢谢, 标记

1 个答案:

答案 0 :(得分:0)

使用 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), #" & Format(ytdDate, "yyyy\/mm\/dd") & "#) >= 0) AS x " & _ 
    "GROUP BY Year(occurrence_date) " & _
    "HAVING Year([occurrence_date]) >= " & Year(ytdDate) & " - 10"

EDIT2:

{{1}}