powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebired3 удобство храение даты без цифры года.
25 сообщений из 34, страница 1 из 2
Firebired3 удобство храение даты без цифры года.
    #39843696
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток форумчане.
Мне нужно в БД хранить деапазон сезонов работы
Например
Код: sql
1.
2.
01.01.2005 - 31.04.2005
31.01.2005 - 31.08.2005


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

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

Спасибо за ответ
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843699
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

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

p.s. "диапазон", "принадлежит".
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843727
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
а, значит исходя из примера
Код: sql
1.
2.
01.01.2005 - 31.04.2005
31.01.2005 - 31.08.2005



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



я об этом думал, но есть ли в FB3 функция, которая например из поля типа " DATE ", вытянуть " число " и " месяц " в типе " integer "?
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843734
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843836
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

1. Диапазоны хранить в днях с начала года. Число получать через extract yearday.
2. Диапазоны хранить в виде чисел, представляющих ММ.ДД, например 101 - 431, 131-831, тогда их можно будет сравнивать на вхождение в диапазон чисел, а не то, что вы начали выдумывать.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843854
a7exander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010это будет 2 поля типа "integer"
и тогда это будет
101 - 3104
3101 - 3108


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

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


где BEGR это начало в формате MMDD, а ENDR конец в формате MMDD
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843861
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

тогда уж номер дня хранить, а не вот это 101 для 1 января. Правда, 29 февраля всё испортит.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843864
a7exander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в диапазоне вместо 28 февраля умышленно сохранять 0229 но тогда диапазон скажем с 28 февраля по 29 февраля станет невозможно задать, но это уже документировать как ограничение системы
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843867
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое здесь громкое эхо.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843894
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

храни как даты. Условный год - двухтысячный. Всё равно extract использовать. Если нужно в интерфейсе где-то показывать, то используй функцию dateadd. В расчётах тоже dateadd рулит в таком случае.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39843928
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010это будет 2 поля типа "integer"
и тогда это будет
Код: sql
1.
2.
101 - 3104
3101 - 3108

Достаточно SMALLINT и хранение по формуле month * 100 + day
Код: plaintext
1.
101 - 431
131-831
Обратные операции, соответственно:
Код: plsql
1.
2.
month = Cast(value / 100 AS SMALLINT)
day = Mod(value, 100)
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844069
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
01.08.2019 11:16, rdb_dev пишет:
> Достаточно SMALLINT

совершенно бесполезный тип данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844148
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a7exander,

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



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

Код: sql
1.
2.
3.
select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO 



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

тут нужно что-то дописать?
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844168
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

В этом случае мой подход рулит.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844175
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010у меня есть два сезона: летний и зимний
соответственно
Код: sql
1.
2.
501 - 1001
1001 - 501


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

и ещё используй between, читабельнее, чем куча <= >=
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844206
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010
Код: sql
1.
2.
3.
select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO


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

тут нужно что-то дописать?Решение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
Код: plsql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844245
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010a7exander,

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




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

Код: sql
1.
2.
3.
select *
from CONDITIONS R
where 602 >= R.SEASON_FROM and 602<= R.SEASON_TO 




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

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

и работал-бы с ней не маясь
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844291
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поддержу предыдущего оратора, почему не забить все сезоны с конкретными датами и проверять даты на вхождение в диапазон
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844351
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devРешение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
Код: plsql
1.
2.
3.
4.
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)...

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

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

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

Код: sql
1.
2.
3.
401 - 1001
1001 - 1201
101 - 401


при изменении числа и месяца в одном из сезонов буду триггером менять их в других двух строках
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844423
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010rdb_devРешение более, чем очевидно, но может не работать в СУБД, отличных от FirebirdSQL в отношении симметрии предиката BETWEEN:
Код: plsql
1.
2.
3.
4.
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%. Запрос правильный.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844427
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, сам лично проверил - действительно не работает. Либо ошибка в мануале, либо в СУБД. Склоняюсь к первому.
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844428
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010Этот запрос в зимних месяцах не работает (FB3)...Если ты действительно программист и читал reference manual для FB3, давно должен был предположить ошибку в ФБ или в мануале и написать обходную реализацию запроса. Ты точно программист?
Код: sql
1.
2.
3.
4.
5.
6.
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)
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844441
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010, не забудь проиндексировать.
Код: sql
1.
2.
3.
4.
CREATE INDEX conditions__from__ix ON conditions (season_from);
COMMIT WORK;
CREATE INDEX conditions__to__ix ON conditions (season_to);
COMMIT WORK;
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844478
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

и в чём же ошибка мануала?
...
Рейтинг: 0 / 0
Firebired3 удобство храение даты без цифры года.
    #39844479
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devKreatorXXI, сам лично проверил - действительно не работает. Либо ошибка в мануале, либо в СУБД. Склоняюсь к первому.
Вообще какое-то странное поведение between.
Вот запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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!
С мануалом явно не совпадает.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebired3 удобство храение даты без цифры года.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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