LINUX.ORG.RU

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

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

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

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

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

в firebird’e есть

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

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

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

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

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

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

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

А по теме.

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

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

ya-betmen ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от Partisan

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

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

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

Именно так.

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

soomrack ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от 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
()