Страница 1 из 2

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

Добавлено: 20 Ноябрь 2017, 16:42
kreator
Нужно вычислять дату сколько-то месяцев назад. Чтобы не изобретать велосипед, не поделится кто-нибудь красивой функцией? На Firebird'е это занимает одну строчку, но сервак дёргать не хочется.

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

Добавлено: 20 Ноябрь 2017, 16:45
Дед Пахом
Можно начать с такой формулы:

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

thatdate = date(day(thisdate), month(thisdate) - x, year(thisdate))

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

Добавлено: 20 Ноябрь 2017, 17:22
Admin
Ага, попался!
thatdate = date(day(thisdate), month(thisdate) - x, year(thisdate))

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

thatdate = date(month(thisdate) - x, day(thisdate), year(thisdate))

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

Добавлено: 20 Ноябрь 2017, 17:25
Дед Пахом
Admin писал(а): 20 Ноябрь 2017, 17:22Ага, попался!
Всё время забываю, что тут совершенно идиотская последовательность аргументов.

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

Добавлено: 21 Ноябрь 2017, 2:18
Admin
Дед Пахом писал(а): 20 Ноябрь 2017, 17:25совершенно идиотская последовательность аргументов.
Есть такое.

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

Добавлено: 21 Ноябрь 2017, 10:33
kreator
К сожалению SV не предусмотрело отрицательные значения месяца и даты. Хотя могли бы. Поэтому и возник вопрос. Может у кого-то работает

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

thatdate = date(-5, 1, 2018)
?

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

Добавлено: 21 Ноябрь 2017, 10:53
Admin
kreator писал(а): 21 Ноябрь 2017, 10:33date(-5, 1, 2018)
И что должно получиться?
-5 от какого месяца?
Если от текущего то зачем год и день?
А как +5 задать?
Напишите уже свой класс/функцию для работы с датами.

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

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

Тогда: date(Month(Today()) - 5, Day(Today()), Year(Day(Today())))

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

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

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

date(15, 1, 2017)
?
Хочу, чтобы и отрицательные числа отрабатывались.
Пишу свою функцию.
Firebird не парится по этому поводу, к примеру.

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

Добавлено: 21 Ноябрь 2017, 12:05
Дед Пахом
The month and day parameters do allow positive out-of-range values

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

Добавлено: 21 Ноябрь 2017, 13:04
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
  

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

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

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

MESSAGE(FORMAT(DateAdd(DateAdd:MONTH,1,DATE(1,30,2017)),@D06b))

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

Добавлено: 21 Ноябрь 2017, 13:10
Admin
Хехе. Кларион сам вернул 2 марта в таком случае :)

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

Добавлено: 21 Ноябрь 2017, 13:34
Дед Пахом
Admin писал(а): 21 Ноябрь 2017, 13:10Хехе. Кларион сам вернул 2 марта в таком случае
.NET-овский класс DateTime в этом случае возвращает 28.02.2017

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

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