LINUX.ORG.RU

Нет в календаре такой даты, по этому ее не возможно записать.

maxcom ★★★★★
()
Ответ на: комментарий от bad_master

Ааа.. у тебя вопрос по самой дате? Тут затрудняюсь сказать. А кто/что формирует такую дату? Откуда она берется? Если это реально дата, то странная на самом деле.

ivama
()

Никак.

Вангую, что это извращение нужно для хранения дня рождения, если известен только возраст. Придется добавлять второе поле — например булево exact_date.

Belkrr
()
Ответ на: комментарий от bad_master

Её в объективной реальности нет, при чём тут firebird? А то что какая-то игрушечная субд жрёт невалидные данные чести ей не делает.

anonymous
()
Ответ на: комментарий от bad_master

в firebird’e есть

Ну квест какой то.) Ни в какой субд нет такой даты, ты не верно формируешь дату. Это же ты хочешь добавить запись в таблицу. СУБД такую фигню тебе записать не позволит.

ivama
()

Поменяй тип колонки на text и добавляй хоть чёрта лысого, только не называй это датой.

vbr ★★★★
()
Ответ на: комментарий от vbr

а что же с остальными записями делать? Да и к тому же фротенд интерфейс завязан на календаре и куча всего остального

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

так в том то и прикол, в базу положить 0 дату нельзя, в календарь тоже, куча арифметики дат на типе данных и все это так - не подступиться

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)
Ответ на: комментарий от bad_master

в базу положить 0 дату нельзя, в календарь тоже

И в итоге всё нормально работает.

AnDoR ★★★★★
()
Ответ на: комментарий от bad_master

Подожди. Ты говоришь, что

  1. в БД данные приходят из календаря;
  2. в календарь это значение не положить, т.к. оно невалидное.

Откуда ты тогда его берёшь вообще?

theNamelessOne ★★★★★
()

Однажды я видел как дба добавлял даты в пострес, он взял в левую руку потгрес, в правую - средних размеров дату, а затем неуловимым движением присобачил одно к другому.

А по теме.

есть вот такая дата '1946-00-00'

Нет такой даты.

ya-betmen ★★★★★
()
Ответ на: комментарий от bad_master

Зачем ты пытаешься невалидную дату из документа сохранить? Как эта дата должна интерпретироваться? Что ты с ней будешь дальше делать?

theNamelessOne ★★★★★
()
Ответ на: комментарий от bad_master

Надо так, интерпретировать как дату, дальше не понятно что это даст тебе

Даты «1946-00-00» не существует в природе, как какую конкретно дату ты собираешься её интерпретировать?

theNamelessOne ★★★★★
()
Ответ на: комментарий от bad_master

тебе выше дали хороший совет, измени поле на текст и не парься, то что ты пытаешься записать в субд не является датой и для документа, о котором ты говоришь это значение ни о чем. Судя по флейму, который образовался на ровном месте, у тебя либо с логикой что то не в порядке, либо в приложении жуткий косяк, либо кто то подшутил над тобой.

ivama
()
Ответ на: комментарий от bad_master

Из документа

Вооот. Значит, надо осмыслить, что за долб оригиналы такой документ делали, и что это означает.

Я бы первым делом посмотрел, в этих документах все даты в таком виде или только некоторые? Если все, то в БД надо просто вместо даты ввести год и не париться. Если только некоторые, то второй вопрос – что эти нули означают.

Наиболее вероятная гипотеза, которую выдвинули выше — когда известен только год, но даже год имеет ценность. В таком случае тебе преобразование совершенно адекватно предлагает 1 января. Просто в таблице рядом с датой надо ввести дополнительное поле only_year, а перед укладкой в базу проверять, нули там или нет. Если нули, помечаем, что известен только год, если нет, пишем всё. И если документ такого же формата надо будет ещё и формировать, делаем обратную операцию, если only_year выставлен в true, превращаем месяц и день на выходе в нули, чтобы отличить их от реального 1 января.

Ну или как предложили выше, вместо даты просто забульбенить (c) @Eddy_Em строковое поле. Но это перекладывание контроля целостности данных с БД на прикладной уровень и в общем случае это фу. Разобраться с проблемой всё же предпочтительнее.

Короче, предметную область надо анализировать. А так, как сформулировано в ОП – это Проблема XY в сочетании с 4.2 :)

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от bad_master

Желаемое. В БД ты отдаёшь данные, а потом запрашиваешь данные. Что ты хочешь получитьв ответ на запрос подобной даты?

Если то же самое - храни в тексте и не мучай бабушку. Если что-то другое - что?

Aceler ★★★★★
()
Ответ на: комментарий от Elyas

для интервала дат в PostgreSQL существует тип с названием interval (сюрприз).

Partisan ★★★★
()
Ответ на: комментарий от ivama

Это был очень плохой совет: вместо того, чтобы изучить, как сделать правильно - обойтись без изучения и сделать неправильно.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

..как сделать правильно..

Трудно сказать, как сделать правильно. Слишком мало исходных данных, тс как то сумбурно объясняет ситуацию. Я понял так, тс получает некий документ и отдает его в субд. СУБД плюётся на такой документ (имею ввиду дату документа). Тем не менее, тс с упорством пытается впихнуть невпихуемое.) Что бы преодолеть сопротивление субд ему предложили простой способ. Это действительно, в нашем случае очень хороший вариант. ТС должен понять, что такой документ не может участвовать в электронном документообороте и храниться в электронном виде, так как документ имеет поле даты и в этом поле должна быть информация соответствующая, ликвидная. Пусть тс сделает приведение типов.) Либо ликвидная дата, либо соответствующее поле. Дискуссия бессмысленная, что тут изучать?

ivama
()
Ответ на: комментарий от ivama

Именно так.

Я бы в этой ситуации сделал бы дополнительное поле с исходными данными в текстовом формате – исходные данные, из которых уже заполнял бы поле даты со своими правилами приведения, если дата некорректна или отсутствует, для текущей даты может сделал бы NULL, может 1 января 1946 года, в зависимости от задачи. Может быть сделал бы еще отдельное числовое поле для года, если только год принципиален для каких-то выборок…

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Вариантов может быть много, однако для принятия правильного решения надо знать бизнес-логику приложения.

ivama
()
Ответ на: комментарий от bad_master

Надо так, интерпретировать как дату

Ну интерпретируй.

to_date(‘1946-00-00’,‘YYYY-MM-DD’) - записывает 1946-01-01

Чем тебя такая интерпретация не устраивает? Если исходная «дата» обозначает просто год, то этот вариант сойдёт.

no-such-file ★★★★★
()
Ответ на: комментарий от bad_master

Если предполагаются и конкретные даты, то нужно менять логику работы. Сохранять отдельно признак, полная дата, или нет. Как вариант сохранять диапазон дат. Т.е. 1946-01-01, 1946-12-31. Для полных дат диапазон будет одним днём.

С другой стороны, если тебе не нужно вычислять интервалы прямо в БД и всё такое, то сохраняй тупо в строку, как уже советовали.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от bad_master

А ты и не знаешь дату же, ты знаешь год и всё. Месяц и день там любые могут быть. Тебе прост не с чем путать. Я удалил коммент свой с клоунадой, но если кратко то может это нечёткая дата, когда известен лишь год и всё, такое может не надо хранить как тип дата, а просто как строку, а интерпретировать уже на уровне логики приложения. Не всегда же известна точная дата, порой знаешь просто про год и месяц, а про день нет, вот и надо как-то это выделять, ну вот видимо у тебя и выделяют это нулями.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от bad_master

А «чтобы потом не спутать», я выше предложил вариант, как сделать.

hobbit ★★★★★
()
Ответ на: комментарий от Shprot

…И самое забавное будет, если в следующих версиях FB этот баг исправят, а все, кто его использовал как фичу, получат граблями по лбу :)

hobbit ★★★★★
()
Ответ на: комментарий от Belkrr

Хороший Ванга, я не сообразил, что это за хрень. А так - логично.

blex ★★★
()
Ответ на: комментарий от hobbit

Да нет никакого бага. Это же ТС, ему такое вбросить, как 4.2 пальца об асфальт.

$ isql-fb

SQL> create database 'mydb.fdb';
SQL> CREATE TABLE TEST (D DATE);
SQL> INSERT INTO TEST VALUES ('2024-07-25');
SQL> INSERT INTO TEST VALUES ('2024-00-00');
Statement failed, SQLSTATE = 22018
conversion error from string "2024-00-00"
dataman ★★★★★
()

Вместо поля дата сделай три отдельных поля - year, month, day и сам с ним потом разбирайся, где там у тебя получается вторник, а где неизвестно что. Потому что у тебя это не дата, и календарные функции типа дня недели с такими датами все равно работать не будут

shimshimshim
()
Ответ на: комментарий от bad_master

как-то дату по-моему впихнули

Я тоже впихнул, но на 100% уверен, что в sqlite.

dataman ★★★★★
()
Ответ на: комментарий от dataman

$ isql-fb

Ох Ё! … А какая версия? Я его 20+ лет уже не пользовал :)

ЗыЖ: Восстановление из бэкапа починили или всё та же лотерея? :)

anonymous
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.