powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / работа с датами в Interbase 2009
22 сообщений из 47, страница 2 из 2
работа с датами в Interbase 2009
    #39119253
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.
SET TERM ^;
CREATE OR ALTER PROCEDURE SUBYEAR
  (
    TMSTMP  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CNT     SMALLINT DEFAULT 1
  )
  RETURNS
  (
    RET     TIMESTAMP
  )
AS
  DECLARE VARIABLE T NUMERIC(14, 2) DEFAULT NULL;
  DECLARE VARIABLE Y INTEGER DEFAULT NULL;
BEGIN
  IF (:CNT > 0) THEN
    BEGIN
      IF (:CNT > 1) THEN
        SELECT RET - 365
          FROM SUBYEAR(:TMSTMP, :CNT - 1)
          INTO: RET;
      ELSE
        RET = TMSTMP - 365;
      Y = EXTRACT(YEAR FROM :RET);
      T = CAST(Y AS NUMERIC(14, 2)) / 4 - Y / 4;
      IF (:T = 0 AND RET < CAST(Y || '-12-31 00:00' AS TIMESTAMP)) THEN
        RET = RET - 1;
    END
  SUSPEND;
END^
SET TERM ;^
COMMIT WORK;



Проходит следующую процедуру проверки:
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
CREATE GLOBAL TEMPORARY TABLE TEST_SUBYEAR
(
    SRC   TIMESTAMP NOT NULL,
    XPECT TIMESTAMP NOT NULL,
    CNT   SMALLINT  DEFAULT 1 NOT NULL,
  CONSTRAINT TEST_SUBYEAR PRIMARY KEY (SRC, CNT)
) ON COMMIT DELETE ROWS;
COMMIT WORK;


EXECUTE BLOCK
  RETURNS
  (
    ACTSTR  VARCHAR(78),
    XPECTD  TIMESTAMP,
    RESULT  TIMESTAMP,
    STATUS  CHAR(4)
  )
AS
BEGIN
  INSERT INTO TEST_SUBYEAR VALUES ('2016-01-01 00:00', '2015-01-01 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-01-01 00:00', '2012-01-01 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-02-28 00:00', '2015-02-28 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-02-28 00:00', '2012-02-28 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-02-29 00:00', '2015-03-01 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-02-29 00:00', '2012-02-29 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-03-01 00:00', '2015-03-02 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-03-01 00:00', '2012-03-01 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-12-31 00:00', '2015-12-31 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2016-12-31 00:00', '2012-12-31 00:00', 4);

  INSERT INTO TEST_SUBYEAR VALUES ('2017-01-01 00:00', '2016-01-01 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-01-01 00:00', '2013-01-01 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-02-28 00:00', '2016-02-28 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-02-28 00:00', '2013-02-28 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-03-01 00:00', '2016-02-29 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-03-01 00:00', '2013-03-01 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-12-30 00:00', '2016-12-29 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-12-30 00:00', '2013-12-30 00:00', 4);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-12-31 00:00', '2016-12-31 00:00', 1);
  INSERT INTO TEST_SUBYEAR VALUES ('2017-12-31 00:00', '2013-12-31 00:00', 4);

  FOR
      SELECT
          'SUBYEAR(''' || SRC || ''', ' || CNT || ') == ''' || XPECT || '''',
          XPECT,
          (SELECT RET FROM SUBYEAR(SRC, CNT))
        FROM TEST_SUBYEAR
        ORDER BY SRC, CNT
        INTO: ACTSTR, XPECTD, RESULT
    DO
      BEGIN
        IF (:XPECTD = :RESULT) THEN
          STATUS = 'PASS';
        ELSE
          STATUS = 'FAIL';
        SUSPEND;
      END
END;
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39119263
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Секретное имя пользователя2. Да и х** с ними, високосными годами, они там раз в сто лет не так, посмотри лучше, что даст твой алгоритм для исходной даты 01.01.2012
Окстись, родной! Каждый четвертый год.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39119284
Фотография Секретное имя пользователя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorСекретное имя пользователя2. Да и х** с ними, високосными годами, они там раз в сто лет не так, посмотри лучше, что даст твой алгоритм для исходной даты 01.01.2012
Окстись, родной! Каждый четвертый год.Раз в сто лет не так, как обычно
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39119431
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам> 01 марта следующего за високосным года за вычетом года,
> это 29 февраля високосного, а 2 марта - 1 марта високосного.

OMG, сделайте мне развидеть это.
Сжалься над собой, сходи в Кащенко.
Испытываешь серьезные проблемы с пониманием изложенного? Объясню на пальцах:
1. 29 февраля, это 60-ый день високосного года;
2. 60-ый день невисокосного года - 1 марта;
Так понятней или у тебя еще остались проблемы в понимании азов григорианского календаря?
https://ru.wikipedia.org/wiki/Григорианский_календарь

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

Гаджимурадов РустамНу конечно нет. Внезапно?
Да! Внезапно обнаружил у тебя потрясающую, а главное - ничем не аргументированную уверенность в собственной неправоте.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120067
_Читатель_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый(е) модераторы!

Я хоть и не участник форума, но регулярно его читаю уже на протяжении более 10 лет,
и хочу заметить, что в последнее время форум, извините, засран тупыми и неинформативными
сообщениями DBConstructor-а настолько что... короче сильно. В связи с этим убедительно прошу
забанить DBConstructor-а нафик.

С уважением, Читатель.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120217
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамOMG, сделайте мне развидеть это.
Говорят, шизофреники вполне себе логичны в рамках своего выдуманного мира.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120305
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryГоворят, шизофреники вполне себе логичны в рамках своего выдуманного мира.
Говорят, люди частенько других примеряют по себе.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120329
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Повтори свой бред про календарные дни, я попробую примерить.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120334
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, изволь:
1. 29 февраля, это 60-ый день високосного года;
2. 60-ый день невисокосного года - 1 марта;
https://ru.wikipedia.org/wiki/Григорианский_календарь
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120346
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Не, не примеряется.
Никак у меня в голове не совмещается задача "добавить/отнять год (месяц, неделю)" и "календарные дни" или "60 дней с начала года".
Ведь сегодня 4 декабря, и через месяц будет 4 января, а не 3 января, как в твоём параллельном мире через 30 дней.

Ну и раз есть ссылка на что-то, то я тоже приведу. Лунный календарь.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120433
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, похоже, что кто-то из присутствующих считает, что арифметические операции неприменимы к календарным датам и операция "29 февраля 2016г. минус 1 год" вызывает в их мозгу исключение, сходное с исключением "divide by zero".
Чтож... Не буду разубеждать.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120555
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Ты и не сможешь никого разубедить. Поскольку убеждать в чём-то можно фактами и умозаключениями.
А ты пишешь сперва "минус год", и тут же начинаешь считать сутками. Где логика?
Вопрос риторический.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120599
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, ну хорошо... Если ты так ставишь вопрос, то:
1. Приведи определение понятию "календарный год" Григорианского календаря;
2. Приведи результат вычисления "29 февраля 2016г. минус 1 год";
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120616
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor2. Приведи результат вычисления "29 февраля 2016г. минус 1 год";Задолбал, если честно, неужели сам не осилил конструкцию:
select dateadd (-1 year to date '29.02.2016') from rdb$database
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120652
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor1. Приведи определение понятию "календарный год" Григорианского календаря;Ты ж даже ссылку приводил, из педивикии. Вот и прочти.
DBConstructor2. Приведи результат вычисления "29 февраля 2016г. минус 1 год";Детская задачка.
Гораздо интереснее ответ на вопрос "28 февраля 2015г. плюс 1 год". Вот здесь уже нет однозначного ответа, без доп.условий.
Тут даже dateadd не поможет.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39120665
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyЗадолбал, если честно, неужели сам не осилил конструкцию:
select dateadd (-1 year to date '29.02.2016') from rdb$database
Не знал, что в современной версии Interbase это есть. У меня LangRef только для IB2009.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39121037
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик (внезапно!) получил продолжение.
DBConstructorИспытываешь серьезные проблемы с пониманием изложенного? Объясню на пальцах:
1. 29 февраля, это 60-ый день високосного года;
2. 60-ый день невисокосного года - 1 марта;Голубочик, объяснить мне тебе не по силам.
Дискутировать я с тобой не буду, конечно, но
мне всё же интересно, чему будет равняться
по этой твоей логике "31.12.2016 +1 год" ?

Нет, ответ я примерно представляю, конечно,
но хочу посмотреть, как ты будешь "вилять".
Так, чисто поржать. (с) КВН

DBConstructorДа! Внезапно обнаружил у тебя потрясающую, а главное - ничем
не аргументированную уверенность в собственной не правоте.Гм... Тебе не только в Кащенко надо сходить,
но и к филологу, однозначно.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39121046
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery2. Приведи результат вычисления "29 февраля 2016г. минус 1 год";Детская задачка.
Гораздо интереснее ответ на вопрос "28 февраля 2015г. плюс 1 год".
Вот здесь уже нет однозначного ответа, без доп.условий.Знаешь, я бы не сказал, что детская. По сути, эти две задачки
идентичны, способ формирования ответа на них одинаковый.
Собсно, формулировка Сидорова: 18504735 и 18504748

Твоё "нет однозначного ответа" я понимаю (выбор из двух),
но и в минус ситуация та же - один ответ на два вопроса.

Почему-то вспомнились мнимые числа, та же нестыковка.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39121931
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТвоё "нет однозначного ответа" я понимаю (выбор из двух)
Тогда три варианта.
Просто ответы на два из них совпадают, но это не делает их равнозначными.
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39122667
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> Тогда три варианта.

Какие именно три?

> Просто ответы на два из них совпадают, но это не делает их равнозначными.

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

Сперва ответь, какие два варианта для "29 февраля 2016 минус год"
...
Рейтинг: 0 / 0
работа с датами в Interbase 2009
    #39123016
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryСперва ответь, какие два варианта для "29 февраля 2016 минус год"
На 29 минус год не 2 ответа, а один ответ (28.02) на 2 вопроса (29.02- и 28.02-).
На "28 февраля 2015г. плюс 1 год" "возможных" (если не договориться) ответов
тоже два - 28.02.16 и 29.02.16, потому и задачи идентичные, на мой взгляд.

А в каком случае (вопросе) может быть три варианта ответа, я не уловил.
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / работа с датами в Interbase 2009
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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