在Access中创建两个日期之间的月份列表

时间:2010-10-25 13:58:07

标签: sql ms-access access-vba

我正在使用Microsoft Access。现在我想列出两个日期之间的日期。

例如输入:1-1-2010和5-1-2010 给我价值观。

2010年1月1日
2010年2月1日
2010年3月1日
2010年4月1日
5-1-2010

如果可能,我想在SQL中执行此操作,否则在VBA中执行此操作。

2 个答案:

答案 0 :(得分:3)

使用以下代码添加一个名为YrMos的本地表,根据需要调整开始/结束年份(注意:我在这里使用RunSQL只是因为它与DAO / ADO无关;还有更好的DAO和ADO替代方案) :

Sub CreateYrMos()
Const StartYear = 1950
Const EndYear = 2050
Dim Y As Integer, M As Integer

    DoCmd.SetWarnings False
    DoCmd.RunSQL "CREATE TABLE YrMos " & _
                 "(MoStart DATE CONSTRAINT MoStartIndex PRIMARY KEY, " & _
                 " MoEnd Date CONSTRAINT MoEndIndex UNIQUE, " & _
                 " Yr Integer, Mo Integer, DaysInMo Integer, " & _
                 " CONSTRAINT YrMoIndex UNIQUE (Yr, Mo))"
    For Y = StartYear To EndYear
        For M = 1 To 12
            DoCmd.RunSQL "INSERT INTO YrMos (MoStart, MoEnd, Yr, Mo, DaysInMo) " & _
                         "VALUES (#" & DateSerial(Y, M, 1) & "#, #" & DateSerial(Y, M + 1, 0) & "#, " & Y & ", " & M & ", " & Day(DateSerial(Y, M + 1, 0)) & ")"
        Next M
    Next Y
    DoCmd.SetWarnings True
End Sub

使用上面的代码创建表后,实际的查询变得微不足道了:

SELECT YrMos.*
FROM YrMos
WHERE MoStart BETWEEN #1/1/2010# AND #5/1/2010#

我在几个访问应用程序中保留了此表的本地副本(适合我的需要的年份)。我发现它比其他更优雅的解决方案更有效,更实用。

答案 1 :(得分:0)

你的格式是mm-dd-yyyy还是dd-mm-yyyy?

修改

根据您的评论和信息,以下是我在T-SQL中完成它的方法

设置:

-- drop table dates 
create table dates (value datetime)

insert into dates
select '1-1-2010'
union select '5-1-2010'

WHILE循环:

declare @output table (listDates datetime)
declare @maxDate datetime
declare @minDate datetime

set @maxDate = (select MAX(value) from dates)
set @minDate = (select MIN(value) from dates)

while @minDate <= @maxDate
    begin
     insert into @output select @minDate
     set @minDate = DATEADD(mm,1,@minDate)
    end 

select * from @output

这给了我输出

listDates
-----------------------
2010-01-01 00:00:00.000
2010-02-01 00:00:00.000
2010-03-01 00:00:00.000
2010-04-01 00:00:00.000
2010-05-01 00:00:00.000

格式是导入的,因为DATEADD函数需要知道您是否要为该值添加月,日,年等。因此,如果您想要添加天数,可以将mm更改为dd,这会为您提供更长的列表。

希望这可以帮助你。