Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Firebired3 удобство храение даты без цифры года.  [new]
Kos-2010
Member

Откуда:
Сообщений: 216
Доброе время суток форумчане.
Мне нужно в БД хранить деапазон сезонов работы
Например
01.01.2005 - 31.04.2005
31.01.2005 - 31.08.2005

И т.д.
Соответственно без номеров лет, только «число» и «месяц».

В каком формате удобно будет хранить мне эту иформацию? с учетом, что я хочу проводить операции с датами в внутренней процедуре Firebired.
Например: одним из входных параметров для внутренней процедуры будет дата, и мне понадобится узнать к какому сезону она пренадлежит.

Спасибо за ответ
31 июл 19, 19:59    [21939279]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28116
Kos-2010,

без года день и месяц это просто отдельные числа, а не дата.

p.s. "диапазон", "принадлежит".
31 июл 19, 20:23    [21939291]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Kos-2010
Member

Откуда:
Сообщений: 216
kdv,
а, значит исходя из примера
01.01.2005 - 31.04.2005
31.01.2005 - 31.08.2005


это будет 2 поля типа "integer"
и тогда это будет
101 - 3104
3101 - 3108


я об этом думал, но есть ли в FB3 функция, которая например из поля типа "DATE", вытянуть "число" и "месяц" в типе "integer"?
31 июл 19, 22:30    [21939339]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
ёёёёё
Member

Откуда:
Сообщений: 728
Kos-2010,

https://firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html
31 июл 19, 22:50    [21939354]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16382
Kos-2010,

1. Диапазоны хранить в днях с начала года. Число получать через extract yearday.
2. Диапазоны хранить в виде чисел, представляющих ММ.ДД, например 101 - 431, 131-831, тогда их можно будет сравнивать на вхождение в диапазон чисел, а не то, что вы начали выдумывать.
1 авг 19, 09:12    [21939481]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
a7exander
Member

Откуда:
Сообщений: 20
Kos-2010
это будет 2 поля типа "integer"
и тогда это будет
101 - 3104
3101 - 3108


если уж собрались хранить месяц + дату в одном поле integer то хоть тогда уж сделайте так чтобы 02 января было < 01 февраля, то есть
02 января это 102
01 февраля это 201

это позволит в вашей процедуре перевести дату в integer в формат MMDD и искать попадание в диапазон запросом типа
select *
from MYRANGE R
where MMDD >= R.BEGR and MMDD<= R.ENDR

где BEGR это начало в формате MMDD, а ENDR конец в формате MMDD
1 авг 19, 09:34    [21939500]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28116
Kos-2010,

тогда уж номер дня хранить, а не вот это 101 для 1 января. Правда, 29 февраля всё испортит.
1 авг 19, 09:43    [21939511]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
a7exander
Member

Откуда:
Сообщений: 20
в диапазоне вместо 28 февраля умышленно сохранять 0229 но тогда диапазон скажем с 28 февраля по 29 февраля станет невозможно задать, но это уже документировать как ограничение системы
1 авг 19, 09:45    [21939515]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16382
Какое здесь громкое эхо.
1 авг 19, 09:50    [21939521]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
Kos-2010,

храни как даты. Условный год - двухтысячный. Всё равно extract использовать. Если нужно в интерфейсе где-то показывать, то используй функцию dateadd. В расчётах тоже dateadd рулит в таком случае.
1 авг 19, 10:33    [21939567]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Kos-2010
это будет 2 поля типа "integer"
и тогда это будет
101 - 3104
3101 - 3108
Достаточно SMALLINT и хранение по формуле month * 100 + day
101 - 431
131-831
Обратные операции, соответственно:
month = Cast(value / 100 AS SMALLINT)
day = Mod(value, 100)
1 авг 19, 11:16    [21939616]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30313

01.08.2019 11:16, rdb_dev пишет:
> Достаточно SMALLINT

совершенно бесполезный тип данных.

Posted via ActualForum NNTP Server 1.5

1 авг 19, 13:39    [21939826]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Kos-2010
Member

Откуда:
Сообщений: 216
a7exander,

Ну вот хорошо, храню я в формате "ММДД", ("хранение по формуле month * 100 + day")
у меня есть два сезона: летний и зимний
соответственно
501 - 1001
1001 - 501


если я задам например июньскую дату например 602, он по

select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO 


найдет нужный сезон - "лето"
а как быть с зимними датами, например мартовской 307?

тут нужно что-то дописать?
1 авг 19, 15:16    [21939948]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
Kos-2010,

В этом случае мой подход рулит.
1 авг 19, 15:34    [21939972]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16382
Kos-2010
у меня есть два сезона: летний и зимний
соответственно
501 - 1001
1001 - 501

101 - 430 зима
501 - 930 лето
1001 - 3112 зима

и ещё используй between, читабельнее, чем куча <= >=
1 авг 19, 15:39    [21939981]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Kos-2010
select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO

найдет нужный сезон - "лето"
а как быть с зимними датами, например мартовской 307?

тут нужно что-то дописать?
Решение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
SELECT *
  FROM conditions c
  WHERE :value NOT BETWEEN c.season_to AND c.season_from
    OR :value BETWEEN c.season_from AND c.season_to
1 авг 19, 16:06    [21940025]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1347
Kos-2010
a7exander,

Ну вот хорошо, храню я в формате "ММДД", ("хранение по формуле month * 100 + day")
у меня есть два сезона: летний и зимний
соответственно
501 - 1001
1001 - 501



если я задам например июньскую дату например 602, он по

select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO 



найдет нужный сезон - "лето"
а как быть с зимними датами, например мартовской 307?

тут нужно что-то дописать?

Озвучил-бы вкратце изначальную постановку задачи, а не промежуточные выводы
глядишь и толку было-бы больше.
зы. Насколько я понимаю:
- рано или поздно год все равно понадобится
- как бы не божились что даты начала и окончания сезонов не будут меняться верить этому нельзя
И исходя из этого я бы не заморачивался с такими хитростями
завел бы табличку
год
сезон
дата начала (именно дата)
дата окончания (именно дата)
......
заполнял-бы её (либо ручками на далеко вперед, либо при "закрытии/открытии нового сезона")

и работал-бы с ней не маясь
1 авг 19, 17:17    [21940084]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1642
поддержу предыдущего оратора, почему не забить все сезоны с конкретными датами и проверять даты на вхождение в диапазон
1 авг 19, 19:37    [21940150]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Kos-2010
Member

Откуда:
Сообщений: 216
rdb_dev
Решение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
SELECT *
  FROM conditions c
  WHERE :value NOT BETWEEN c.season_to AND c.season_from
    OR :value BETWEEN c.season_from AND c.season_to

Этот запрос в зимних месяцах не работает (FB3)...

WildSery
101 - 430 зима
501 - 930 лето
1001 - 3112 зима

и ещё используй between, читабельнее, чем куча <= >=


Да, попробую поэкспериментировать.
Действительно, у меня в приложении пользователь может менять числа ("от"..."до") и месяцы только в двух сезонах: лето и зима.
Заведу в таблице 3 строки (лето, зима, зима):

401 - 1001
1001 - 1201
101 - 401

при изменении числа и месяца в одном из сезонов буду триггером менять их в других двух строках
1 авг 19, 23:34    [21940244]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
Kos-2010
rdb_dev
Решение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
SELECT *
  FROM conditions c
  WHERE :value NOT BETWEEN c.season_to AND c.season_from
    OR :value BETWEEN c.season_from AND c.season_to

Этот запрос в зимних месяцах не работает (FB3)...


Должен работать на 100%. Запрос правильный.
2 авг 19, 09:32    [21940358]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
KreatorXXI, сам лично проверил - действительно не работает. Либо ошибка в мануале, либо в СУБД. Склоняюсь к первому.
2 авг 19, 09:33    [21940364]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Kos-2010
Этот запрос в зимних месяцах не работает (FB3)...
Если ты действительно программист и читал reference manual для FB3, давно должен был предположить ошибку в ФБ или в мануале и написать обходную реализацию запроса. Ты точно программист?
SELECT *
  FROM conditions c
  WHERE (c.season_from >= c.season_to
      AND :value NOT BETWEEN c.season_to AND c.season_from)
    OR (c.season_from < c.season_to
      AND :value BETWEEN c.season_from AND c.season_to)
2 авг 19, 09:36    [21940368]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Kos-2010, не забудь проиндексировать.
CREATE INDEX conditions__from__ix ON conditions (season_from);
COMMIT WORK;
CREATE INDEX conditions__to__ix ON conditions (season_to);
COMMIT WORK;
2 авг 19, 09:49    [21940392]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9821
rdb_dev,

и в чём же ошибка мануала?
2 авг 19, 10:42    [21940448]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
rdb_dev
KreatorXXI, сам лично проверил - действительно не работает. Либо ошибка в мануале, либо в СУБД. Склоняюсь к первому.

Вообще какое-то странное поведение between.
Вот запрос:
with q(v1, v2) as (
  select 501, 1001 from rdb$database
  union all
  select 1001, 501 from rdb$database
)
select q.v1, q.v2
from q
where 602 between q.v1 and q.v2 or 602 between q.v2 and q.v1

Выдаёт две записи. Отключение поочередно условия в фильтре приводят к выдаче то первой, то второй записи. Заметьте - без NOT!
С мануалом явно не совпадает.
2 авг 19, 10:45    [21940449]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
Симонов Денис
rdb_dev,

и в чём же ошибка мануала?


В мануале написано, что Between не является симметричным. И что, если второе значение будет меньше первого, то результат ложь. Приведённый мной запрос работает вообще непонятно. Результата "Ложь" нет.
2 авг 19, 10:50    [21940454]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 16382
KreatorXXI,

Где здесь странность-то?
602 всегда будет либо между v1 и v2, либо наоборот.
2 авг 19, 10:55    [21940460]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9821
KreatorXXI
Симонов Денис
rdb_dev,

и в чём же ошибка мануала?


В мануале написано, что Between не является симметричным.


здесь нет ошибки
2 авг 19, 11:02    [21940468]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
WildSery,

похоже всё правильно. Я что-то запутался.
2 авг 19, 11:10    [21940474]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 783
Я неправ. Всё хорошо. Вообще не надо писать первое значение большим второго. Это в любом случае "ложь". И с NOT, и без. Второй запрос rdb_dev работает.
Читаемость и логичность такого выверта хромает.
2 авг 19, 11:24    [21940490]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Симонов Денис
rdb_dev,

и в чём же ошибка мануала?
Экскуз муа!
В мануале всё верно. Я, почему-то, решил, что и ":value BETWEEN ... AND ...", и ":value NOT BETWEEN ... AND ..." должны быть FASLE. Не выспался, наверное.

Хотя, при первом аргументе больше второго я предпочёл бы получить результат NULL (типа "пустое множество"), что было бы более логичным.
2 авг 19, 11:28    [21940495]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
KreatorXXI
WildSery,

похоже всё правильно. Я что-то запутался.
Такая же фигня.
2 авг 19, 11:29    [21940497]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1642
rdb_dev
Kos-2010, не забудь проиндексировать.
CREATE INDEX conditions__from__ix ON conditions (season_from);
COMMIT WORK;
CREATE INDEX conditions__to__ix ON conditions (season_to);
COMMIT WORK;

а точно оба индекса нужны?
2 авг 19, 11:50    [21940521]     Ответить | Цитировать Сообщить модератору
 Re: Firebired3 удобство храение даты без цифры года.  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2929
Дегтярев Евгений, а проверить через анализ производительности!
2 авг 19, 12:21    [21940558]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить