Страница 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 не предусмотрело отрицательные значения месяца и даты. Хотя могли бы. Поэтому и возник вопрос. Может у кого-то работает
?
Сдвиг даты в прошлое
Добавлено: 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 от какого месяца?
А что получается при этом:
?
Хочу, чтобы и отрицательные числа отрабатывались.
Пишу свою функцию.
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
Ну исправить недолго если нужно.