Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти количество целых месяцев между двумя датами 
:(
    Опции темы
Dedal
Дата 15.12.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 6.5.2004

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Dedal - 15.12.2006, 16:35
PM MAIL   Вверх
Dremlin
Дата 15.12.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



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

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 
Вай, вай, как расцветка кода плывет, ужасть
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
SergKO
Дата 28.12.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 231
Регистрация: 14.3.2005

Репутация: 17
Всего: 20



Попробуйте так

Код

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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.