Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Найти количество целых месяцев между двумя датами


Автор: Dedal 15.12.2006, 16:31
Задачка такая. Есть табличка с тремя столбцами: StartDate, EndDate, MonthCount. Пусть значение первого 2006-01-12, а второго 2006-03-20 (в формате год-месяц-день). Как найти число целых месяцев между этими датами, записать это число в третий столбец и установить в  поля дат новые значения, соответствующие найденному периоду. Для приведенного примера целый месяц будет один (февраль), а в эти столбцы надо записать новые значения, соответствующие найденному периоду (2006-02-01 и 2006-02-28). На первый взгляд ничего сложного, но что-то не придумывается решение.

Автор: Dremlin 15.12.2006, 17:31
Вечером пятницы мне в голову приходит только такое:
Код

declare @start datetime, @end datetime, @newstart datetime, @newend datetime
declare @id integer

DECLARE Dates CURSOR
FOR
   SELECT TablichkaId, StartDate, EndDate
   FROM Tablichka
OPEN Dates
FETCH NEXT FROM Dates INTO @id, @start, @end
WHILE (@@FETCH_STATUS = 0)
BEGIN
    set @newstart = DATEADD(dd, 1, @start)
    set @newend = DATEADD(dd, -1, @end)

    while (DATEDIFF(mm, @start, @newstart) < 1)
    begin
        set @newstart = DATEADD(dd, 1, @newstart)
    end

    while (DATEDIFF(mm, @newend, @end) < 1)
    begin
        set @newend = DATEADD(dd, -1, @newend)
    end

    select @newstart, @newend, DATEDIFF(mm, @newstart, @newend) + 1
    --update Tablichka set StartDate = @newstart, EndDate = @newend, MonthCount = DATEDIFF(mm, @newstart, @newend) + 1 where TablichkaId = @id
FETCH NEXT FROM Dates INTO @id, @start, @end
END
CLOSE Dates
DEALLOCATE Dates

Проверял без курсора на двух произвольных датах - работает.
Курсор рисовал от нечего делать, поправишь его ежели пригодится.

Добавлено @ 17:32 
Вай, вай, как расцветка кода плывет, ужасть

Автор: SergKO 28.12.2006, 09:03
Попробуйте так

Код

declare @start datetime,
                @end datetime,
                @newstart datetime,
                @newend datetime,
                @id integer;

select @start = '2006-01-12', @end = '2006-04-20';

SELECT    StartDate = 
                    CASE 
                        WHEN Day(@start) = 1 THEN @start    --е. 1-е число, то @start оставляем
                        ELSE DateAdd(month, 1, DateAdd(day, 1 - Day(@start), @start)) --иначе - следующий месяц
                    END,
                EndDate = 
                    CASE
                        WHEN Day(@end) = Day(DateAdd(day, 1 - Day(@end), @end)-1) THEN @end --е. последнее число месяца, то @end оставляем
                        ELSE DateAdd(day, -1, DateAdd(day, 1 - Day(@end), @end)) --иначе - предыдущий месяц
                    END,
                MonthCount = 
                    Month(
                            CASE
                            WHEN Day(@end) = Day(DateAdd(day, 1 - Day(@end), @end)-1) THEN @end
                            ELSE DateAdd(day, -1, DateAdd(day, 1 - Day(@end), @end))
                            END
                            ) - 
                    Month(
                            CASE 
                            WHEN Day(@start) = 1 THEN @start
                            ELSE DateAdd(month, 1, DateAdd(day, 1 - Day(@start), @start))
                            END
                            ) + 1


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)