powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / работа с датами в Interbase 2009
25 сообщений из 47, страница 1 из 2
работа с датами в Interbase 2009
    #39117896
BenKenoby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени!

Какой есть наиболее простой способ вычесть из даты 1 год? Т.е. именно 1 год, а не 365/366 дней :-)
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39117900
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разложить на части EXTRACT-ом, вычесть единицу из года, сложить в строку, преобразовать
CAST-ом и молиться, что дата - не 29-е февраля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39117954
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРазложить на части EXTRACT-ом, вычесть единицу из года, сложить в строку, преобразовать
CAST-ом и молиться, что дата - не 29-е февраля.


Продолжаем пускать поезда под откос? :)

Руководство по языку
SQL СУБД Firebird 2.5

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Функции для работы с датой и временем
DATEADD

Доступно в: DSQL, PSQL.
Синтаксис:
DATEADD (<args>)
<args> ::= amount <unit> TO datetime
| <unit>, amount, datetime
<unit> ::=
YEAR | MONTH | WEEK | DAY | WEEKDAY | YEARDAY
| HOUR | MINUTE | SECOND | MILLISECOND
Параметры функции DATEADD
amount Целое выражение типа SMALLINT или INTEGER (отрицательное
вычитается).
unit Составляющая даты/времени.
datetime Выражение типа DATE, TIME или TIMESTAMP.
Тип возвращаемого результата: определяется третьим аргументом функции.

Пример 8.41. Использование функции DATEADD
DATEADD (28 DAY TO CURRENT_DATE)
DATEADD (-6 HOUR TO CURRENT_TIME)
DATEADD (MONTH, 9, DATEOFCONCEPTION)
DATEADD (-38 WEEK TO DATEOFBIRTH)
DATEADD (MINUTE, 90, TIME 'NOW')
DATEADD (? YEAR TO DATE '11-SEP-1973')
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118108
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Fraks!
You wrote on 2 декабря 2015 г. 11:07:49:

Fraks> Руководство по языку
> SQL СУБД Firebird 2.5весьма актуально для Interbase 2009

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118297
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

а в SP IB2009 можно сделать внешнее соединение к FB 2.5 и там выполнить запрос ?
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118316
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Arioch!
You wrote on 2 декабря 2015 г. 13:24:23:

Arioch> а в SP IB2009 можно сделать внешнее соединение к FB 2.5 и там выполнить запрос ?
а я знаю?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118364
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT
    CURRENT_TIMESTAMP
    - Iif(Mod(Extract(YEAR FROM CURRENT_DATE), 4) = 0, 366, 365)
  FROM RDB$DATABASE;
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118377
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

осталось только найти в IB IIF и MOD.

Вот даже не поленился скачать их LangRef от Interbase XE7. Нету у них ни фига.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118383
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа в SP IB2009 можно сделать внешнее соединение к FB 2.5 и там выполнить запрос ?
нельзя.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118403
Фотография Секретное имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor
Код: sql
1.
2.
3.
4.
SELECT
    CURRENT_TIMESTAMP
    - Iif(Mod(Extract(YEAR FROM CURRENT_DATE), 4) = 0, 366, 365)
  FROM RDB$DATABASE;

Ну неправильно ведь
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118405
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...ещё никто не упомянул cтандартные UDFки типа rFunc :-)
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118413
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Arioch!
You wrote on 2 декабря 2015 г. 14:18:42:

Arioch> ...ещё никто не упомянул cтандартные UDFки типа rFunc :-)
они НЕ стандартные.
а тем более в области работы с датой/временем, для которой оные дёргают клиентскую библиотеку IB/FB.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118414
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Секретное имя пользователя, неправильно что? Принцип расчета?
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118449
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create or alter procedure SUBYEAR (
    ADATE date)
returns (
    OUTDATE date)
AS
declare variable d integer;
declare variable y integer;
declare variable m integer;
declare variable yd integer;
begin
  select extract(day from :adate),
         extract(month from :adate),
         extract(year from :adate)
  from rdb$database
  into :d,:m,:y;
  y=y-1;
  if (m=2 and d=29) then
     begin
        select extract(yearday from cast('31.12.'||:y as date)) from rdb$database
        into :yd;
        if (yd=364) then d=28;
     end
  outdate=cast(d||'.'||m||'.'||y as date);
  suspend;
end
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118587
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль нельзя самостоятельно удалять свои предыдущие сообщения. Моленько накосячил впопыхах.
Думаю, так будет правильнее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SET TERM ^;
CREATE OR ALTER PROCEDURE SUBYEAR
  (
    TMSTMP  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CNT     SMALLINT DEFAULT 1
  )
  RETURNS
  (
    RET     TIMESTAMP
  )
AS
  DECLARE VARIABLE Y INTEGER DEFAULT NULL;
  DECLARE VARIABLE D SMALLINT DEFAULT 365;
BEGIN
  IF (:CNT > 0) THEN
    BEGIN
      IF (:CNT > 1) THEN
        SELECT RET
          FROM SUBYEAR(:TMSTMP, :CNT - 1)
          INTO: RET;
      ELSE
        RET = TMSTMP;
      SELECT EXTRACT(YEAR FROM :RET)
        FROM RDB$DATABASE
        INTO: Y;
      IF (:RET < Cast('01.03.' || :Y AS TIMESTAMP)) THEN Y = Y - 1;
      IF (CAST(:Y AS NUMERIC(14, 2)) / 4 = :Y / 4) THEN D = 366;
      RET = RET - D;
    END
  SUSPEND;
END^
SET TERM ;^
COMMIT WORK;
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118599
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorМоленько накосячил впопыхах.Спешка нужна при ловле блох. Пара постов выше по просьбе автора зачищены.

нет смысла писать подобные выкрутасы в ХП
SELECT EXTRACT(YEAR FROM :RET)
FROM RDB$DATABASE
INTO: Y;

будь лаконичней
Y = EXTRACT(YEAR FROM :RET);

Ariochникто не упомянул cтандартные UDFки типа rFunc :-)Написать свою.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118746
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, какой "год назад" хочет получить ТС для 29 февраля.
А-то вы все ринулись говнокод плодить да про фичи спорить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118749
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вполне разумное соглашение - "день в том же самом месяце, но год назад".
В условиях примера это будет "последний день февраля и пофигу, сколько в нём дней".
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118764
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov> В условиях примера это будет "последний день февраля и пофигу, сколько в нём дней".

Тю, так это проще простого. Тупо в лоб

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or alter procedure subyear ( adate date )
returns ( outdate date )
as
declare variable d integer;
declare variable y integer;
declare variable m integer;
begin
  select extract(day from :adate), extract(month from :adate), extract(year from :adate)
  from rdb$database
  into :d,:m,:y;
  y = :y - 1;
  if (:m = 2 and :d = 29) then
    d = 28;
  outdate=cast(:d || '.' || :m || '.' || :y as date);
  suspend;
end



Ну или любые вариации с проверкой тек. даты на високосность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118766
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, если оторваться задницу от кресла, а руки от чашки
чая и сделать Диме выговор с занесением, то эстетически
и идеологически вместо запроса правильнее будет

d = select extract(day from :adate);
m = extract(month from :adate);
y = extract(year from :adate);

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118773
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам, лично у меня ступор. От какого момента считать 365 дней, а от какого 366.
К примеру, 01 марта следующего за високосным года за вычетом года, это 29 февраля високосного, 28 февраля так и будет - 28 февраля, а 2 марта - 1 марта високосного.
Или я не прав?
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118790
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor> лично у меня ступор

Это бывает 365 дней в году или 366 ?

> 01 марта следующего за високосным года за вычетом года,
> это 29 февраля високосного, а 2 марта - 1 марта високосного.

OMG, сделайте мне развидеть это.
Сжалься над собой, сходи в Кащенко.

> Или я не прав?

Ну конечно нет. Внезапно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39118807
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам, тогда внимательно прочту твой вариант.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39119207
Фотография Секретное имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorСекретное имя пользователя, неправильно что? Принцип расчета?Да
1. Почитай про високосные годы.
2. Да и х** с ними, високосными годами, они там раз в сто лет не так, посмотри лучше, что даст твой алгоритм для исходной даты 01.01.2012
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39119228
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / работа с датами в Interbase 2009
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]