Создать список месяцев между двумя датами в Access - PullRequest
2 голосов
/ 25 октября 2010

Я делаю вещи с Microsoft Access. Теперь я хочу составить список дат между двумя датами.

например, ввод: 1-1-2010 и 5-1-2010 дай мне значения.

1-1-2010
2-1-2010
3-1-2010
4-1-2010
5-1-2010

Я хочу сделать это в SQL, если это возможно, в противном случае в VBA.

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

Добавьте локальную таблицу с именем 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#

Я храню локальную копию этой таблицы (с соответствующим диапазоном лет для моих нужд) в нескольких моих приложениях доступа. Я считаю, что это гораздо более эффективный и практичный подход, чем другие, более «элегантные» решения.

0 голосов
/ 25 октября 2010

Ваш формат мм-дд-гггг или дд-мм-гггг?

Edit:

Основываясь на ваших комментариях и информации, вот как я это сделал в 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, что даст вам гораздо более длинный список.

Надеюсь, это поможет вам.

...