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

Какой есть наиболее простой способ вычесть из даты 1 год? Т.е. именно 1 год, а не 365/366 дней :-)
...
Рейтинг: 0 / 0
01.12.2015, 23:30
    #39117900
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Разложить на части EXTRACT-ом, вычесть единицу из года, сложить в строку, преобразовать
CAST-ом и молиться, что дата - не 29-е февраля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.12.2015, 04:51
    #39117954
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
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
02.12.2015, 11:07
    #39118108
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
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
02.12.2015, 13:15
    #39118297
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Мимопроходящий,

а в SP IB2009 можно сделать внешнее соединение к FB 2.5 и там выполнить запрос ?
...
Рейтинг: 0 / 0
02.12.2015, 13:24
    #39118316
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
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
02.12.2015, 13:49
    #39118364
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Код: sql
1.
2.
3.
4.
SELECT
    CURRENT_TIMESTAMP
    - Iif(Mod(Extract(YEAR FROM CURRENT_DATE), 4) = 0, 366, 365)
  FROM RDB$DATABASE;
...
Рейтинг: 0 / 0
02.12.2015, 13:57
    #39118377
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
DBConstructor,

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

Вот даже не поленился скачать их LangRef от Interbase XE7. Нету у них ни фига.
...
Рейтинг: 0 / 0
02.12.2015, 14:00
    #39118383
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Ariochа в SP IB2009 можно сделать внешнее соединение к FB 2.5 и там выполнить запрос ?
нельзя.
...
Рейтинг: 0 / 0
02.12.2015, 14:10
    #39118403
Секретное имя пользователя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
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
02.12.2015, 14:12
    #39118405
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
...ещё никто не упомянул cтандартные UDFки типа rFunc :-)
...
Рейтинг: 0 / 0
02.12.2015, 14:20
    #39118413
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
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
02.12.2015, 14:20
    #39118414
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Секретное имя пользователя, неправильно что? Принцип расчета?
...
Рейтинг: 0 / 0
02.12.2015, 14:42
    #39118449
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Можно так:

Код: 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
02.12.2015, 16:22
    #39118587
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Жаль нельзя самостоятельно удалять свои предыдущие сообщения. Моленько накосячил впопыхах.
Думаю, так будет правильнее:
Код: 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
02.12.2015, 16:31
    #39118599
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
DBConstructorМоленько накосячил впопыхах.Спешка нужна при ловле блох. Пара постов выше по просьбе автора зачищены.

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

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

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

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
02.12.2015, 19:53
    #39118773
DBConstructor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
Гаджимурадов Рустам, лично у меня ступор. От какого момента считать 365 дней, а от какого 366.
К примеру, 01 марта следующего за високосным года за вычетом года, это 29 февраля високосного, 28 февраля так и будет - 28 февраля, а 2 марта - 1 марта високосного.
Или я не прав?
...
Рейтинг: 0 / 0
02.12.2015, 20:27
    #39118790
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с датами в Interbase 2009
DBConstructor> лично у меня ступор

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

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

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

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

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


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