Сдвиг даты в прошлое

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Сдвиг даты в прошлое

Сообщение kreator »

Нужно вычислять дату сколько-то месяцев назад. Чтобы не изобретать велосипед, не поделится кто-нибудь красивой функцией? На Firebird'е это занимает одну строчку, но сервак дёргать не хочется.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сдвиг даты в прошлое

Сообщение Дед Пахом »

Можно начать с такой формулы:

Код: Выделить всё

thatdate = date(day(thisdate), month(thisdate) - x, year(thisdate))
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Ага, попался!
thatdate = date(day(thisdate), month(thisdate) - x, year(thisdate))

Код: Выделить всё

thatdate = date(month(thisdate) - x, day(thisdate), year(thisdate))
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сдвиг даты в прошлое

Сообщение Дед Пахом »

Admin писал(а): 20 Ноябрь 2017, 17:22Ага, попался!
Всё время забываю, что тут совершенно идиотская последовательность аргументов.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Дед Пахом писал(а): 20 Ноябрь 2017, 17:25совершенно идиотская последовательность аргументов.
Есть такое.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Сдвиг даты в прошлое

Сообщение kreator »

К сожалению SV не предусмотрело отрицательные значения месяца и даты. Хотя могли бы. Поэтому и возник вопрос. Может у кого-то работает

Код: Выделить всё

thatdate = date(-5, 1, 2018)
?
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

kreator писал(а): 21 Ноябрь 2017, 10:33date(-5, 1, 2018)
И что должно получиться?
-5 от какого месяца?
Если от текущего то зачем год и день?
А как +5 задать?
Напишите уже свой класс/функцию для работы с датами.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сдвиг даты в прошлое

Сообщение Игорь Столяров »

kreator писал(а): 21 Ноябрь 2017, 10:33thatdate = date(-5, 1, 2018)
Может быть дату несколько месяцев назад от ТЕКУЩЕЙ ?

Тогда: date(Month(Today()) - 5, Day(Today()), Year(Day(Today())))
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4983
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

Сдвиг даты в прошлое

Сообщение kreator »

Admin писал(а): 21 Ноябрь 2017, 10:53 И что должно получиться?
-5 от какого месяца?
А что получается при этом:

Код: Выделить всё

date(15, 1, 2017)
?
Хочу, чтобы и отрицательные числа отрабатывались.
Пишу свою функцию.
Firebird не парится по этому поводу, к примеру.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сдвиг даты в прошлое

Сообщение Дед Пахом »

The month and day parameters do allow positive out-of-range values
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Вот на скорую руку

Код: Выделить всё

            PROGRAM
  
TDateAdd    ITEMIZE,PRE(DateAdd)
YEAR          EQUATE
MONTH         EQUATE
DAY           EQUATE
!HOUR          EQUATE    
!MINUTE        EQUATE
!SECOND        EQUATE
!MILLISECOND   EQUATE           
            END

TDate       GROUP,TYPE
Day           LONG
Month         LONG
Year          LONG
            END  
  
            MAP
              DateAdd(BYTE DatePart, LONG Number, <LONG Date>), LONG
            END
  
  CODE
  MESSAGE(FORMAT(DateAdd(DateAdd:YEAR,1),@D06b))
  MESSAGE(FORMAT(DateAdd(DateAdd:MONTH,-42),@D06b))
  MESSAGE(FORMAT(DateAdd(DateAdd:DAY,+90),@D06b))
  MESSAGE(FORMAT(DateAdd(DateAdd:MONTH,1,DATE(1,30,2017)),@D06b))
    
DateAdd     PROCEDURE(BYTE DatePart, LONG Number, <LONG Date>)!, LONG
Result      LONG
InDate      GROUP(TDate).  
  CODE
  IF OMITTED(3)
    Result = TODAY()
  ELSE
    Result = Date  
  END  
  InDate.Day = DAY(Result)
  InDate.Month = MONTH(Result)
  InDate.Year = YEAR(Result)
  CASE DatePart
  OF DateAdd:YEAR
    Result = DATE(InDate.Month,InDate.Day,InDate.Year+Number)
  OF DateAdd:MONTH
    Off# = ABS(Number)%12
    IF Number > 0
      InDate.Month += Off#
      InDate.Year += ROUND(ABS(Number)/12,1)
    ELSE
      InDate.Month += -Off#
      InDate.Year += -ROUND(ABS(Number)/12,1)
    END
    Result = DATE(InDate.Month,InDate.Day,InDate.Year)
  OF DateAdd:DAY
    Result += Number
  END
  RETURN Result
  
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Ток забыл при смене месяца число сдвинуть! :)
Или не нужно. Непонятно что в этом случае делать, когда 30 февраля типа. Сдвигать вперед на разницу дней?

Код: Выделить всё

MESSAGE(FORMAT(DateAdd(DateAdd:MONTH,1,DATE(1,30,2017)),@D06b))
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Хехе. Кларион сам вернул 2 марта в таком случае :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сдвиг даты в прошлое

Сообщение Дед Пахом »

Admin писал(а): 21 Ноябрь 2017, 13:10Хехе. Кларион сам вернул 2 марта в таком случае
.NET-овский класс DateTime в этом случае возвращает 28.02.2017
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сдвиг даты в прошлое

Сообщение Admin »

Дед Пахом писал(а): 21 Ноябрь 2017, 13:34в этом случае возвращает 28.02.2017
Ну исправить недолго если нужно.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить