我正在使用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中执行此操作。
答案 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
,这会为您提供更长的列表。
希望这可以帮助你。