早上好,
这是我的问题。我有一个表单,用户可以选择他们想要使用的日期。从那里,在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语句,但是没有用(我很确定我没有正确执行)=]
如果这是非常复杂且没有任何意义,我真的很抱歉,但是任何和所有的输入/建议/帮助都非常感激。
谢谢, 标记
答案 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}}