Работа с типом Date

Привет всем! Есть вопрос.
У меня:
Postgesql 8.3.X
create table proba (id integer primary key, test date);
insert into proba values (1,'2010-10-10');
Задача:
Изменить дату в строке с индексом id=1. А конкретнее только год в этой дате.

Посмотрел документацию, понял, что можно только извлекать определенные куски из даты. Например date_part('year',test);

ЗЫ. Очень нужно, помогите.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

В общем нашел решение, но это

В общем нашел решение, но это более похоже не на решение, а на ТАКОЙ КОСТЫЛЬ....
update proba set test=to_date(('2000'::text || '-'::text || date_part('month',test)::text || '-'::text || date_part('day',test)::text),'YYYY-MM-DD') where id=1;

Если есть более правильный способ, подскажите пожалуйста. Охото правильно использовать возможности субд.

Вопрос на засыпку - а не

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

Можно даже оставить дату как есть и добавить поле год. Тогда во всяком случае будет проще изменить дату - вычесть год, который есть в другом поле и добавить нужный год.

Тогда вопрос на засыпку от

Тогда вопрос на засыпку от меня: "Смысл тогда от существования type date"?

Не в обиду. Просто логично использовать то, что для этого предназначено.
Так есть другой вариант или это единственный возможный?

Смысл в том, чтобы работать с

Смысл в том, чтобы работать с датой как с датой, а не с текстовым полем, состоящим из 3-х субполей.
Дата - это вообще-то число, хранящее количество секунд. Сразу становится понятным, что "изменить год" в этом ключе нетривиальная задача. Другое дело - добавить интервал, вычесть интервал, определить вхождение даты, вычесть одну дату из другой.

Если же вы хотите странного, то и решение будет странное, чего же тут удивительного?

Можно, конечно оптимальней написать:

UPDATE proba SET test = to_date('2000-' || substring(test::text FROM 6), 'YYYY-MM-DD') WHERE id=1;

Но смысл останется тот же.

Попробуйте такой вариант

Попробуйте такой вариант SELECT ('2010-02-03'::date-age('2010-02-03','2008-02-03'))::date
предполагается, значение поля '2010-02-03', необходимо изменить год на 2008

Спасибо за совет, но тут

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

UPDATE proba SET test=(test::date-age(test,to_date('2020-' || substring(test::text FROM 6),'YYYY-MM-DD')))::date WHERE id=1;

Извеняюсь, что сразу не

Извеняюсь, что сразу не написал, но мне еще необходимо хранить время кроме самой даты. По этому и было использовано данное поле.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023