Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 заменить год в дате  [new]
Tester666
Member

Откуда:
Сообщений: 179
Добрый день!
Уже конец рабочего дня и голова не варит совершенно.
Подскажите, такой вопрос - есть даты такого вида '1788-12-12' надо заменить в них год
'2012-12-12', а числа и месяц оставить прежние.
Что-то типа варианта -
UPDATE table
   SET datepart(year,[dtPlanDateStart]) = datepart(year,getdate())
 WHERE year(dtPlanDateStart) like '17%' 
 or year(dtplandatestart) like '18%' 


но он не работает..под вечер в голову ничего больше не пришло..
8 фев 12, 15:29    [12055084]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

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

круто! Вы когда-нибудь слышали термин l-value?
Используйте DATEADD
8 фев 12, 15:31    [12055099]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
Tester666
Member

Откуда:
Сообщений: 179
Но ведь в DATEADD нужно указывать какой интервал прибавить, у меня ж много разных левых лет (18**, 17**), мне их нужно по всем вычислять что ли, чтоб 2012 получить?
8 фев 12, 15:38    [12055186]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Tester666, тип поля какой, строка?
8 фев 12, 15:43    [12055247]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

Откуда:
Сообщений: 8711
Tester666
Но ведь в DATEADD нужно указывать какой интервал прибавить, у меня ж много разных левых лет (18**, 17**), мне их нужно по всем вычислять что ли, чтоб 2012 получить?

А что, это офигеть какая проблема типа?
declare @t table (dt date)

insert @t values('17180205'),('17170607'),('19210809'), ('20120910')

select DATEADD(YEAR, DATEDIFF(YEAR,dt,'2012'), dt)
from @t 
where dt < '1900'
8 фев 12, 15:48    [12055321]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
;WITH cte AS (
SELECT '1788-02-12' f UNION ALL SELECT '1899-10-02' UNION ALL SELECT '2010-08-09'
)
-- или UPDATE
SELECT '2012'+RIGHT(f,LEN(f)-4) FROM cte
WHERE LEFT(f,2) IN ('17','18')
8 фев 12, 15:48    [12055323]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Что должно получиться, если от '20120229' отнять один год?
Так что простая замена далеко не всегда возможна
8 фев 12, 15:55    [12055408]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
Что должно получиться, если от '20120229' отнять один год?
Так что простая замена далеко не всегда возможна
Короче, как надо заменять високосный год на невисокосный и наоборот?
8 фев 12, 15:57    [12055434]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

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

он же в 2012 переводит, т.е. в високосный, так что такой проблемы нет.
8 фев 12, 16:02    [12055518]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iljy
iap,

он же в 2012 переводит, т.е. в високосный, так что такой проблемы нет.
Не надеется дожить до 2013?
8 фев 12, 16:04    [12055531]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
iljy
iap,

он же в 2012 переводит, т.е. в високосный, так что такой проблемы нет.
Не надеется дожить до 2013?

Вот уж не знаю но у него сама задача какая-то странная, похоже, что напортачили при вводе данных, так что (надеюсь) задача разовая.
8 фев 12, 16:06    [12055560]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
StPatrick
Member

Откуда:
Сообщений: 28
Я бы просто год заменил да и все.

declare @t table (dt date)

insert @t values('17180205'),('17170607'),('19210809'), ('20120910')

select convert(date, '2012' + right(convert(nvarchar(8), dt, 112), 4), 112)
from @t 
where dt < '19000101'
8 фев 12, 17:07    [12056432]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

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

И в чем принципиальная разница? Кроме использования преобразования в троку и обратно вместо документированных функций работы с датой? К тому же, если действительно возникнет проблема с високосным/невисокосным годом, ваш вариант тупо брякнется.
8 фев 12, 17:11    [12056474]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
StPatrick
Member

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

топикстартер переводит в 2012 год, так что не брякнется
принципиальной разницы нет
8 фев 12, 17:22    [12056613]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
StPatrick
Member

Откуда:
Сообщений: 28
iljy
iap
пропущено...
Не надеется дожить до 2013?

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

может быть, у него задача о днях рождениях сообщать -> вытащить все даты рождения в текущем году.
8 фев 12, 17:25    [12056670]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
StPatrick
iljy
пропущено...

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

может быть, у него задача о днях рождениях сообщать -> вытащить все даты рождения в текущем году.
А с родившимися 29 февраля как же?
Или о них раз в четыре года вспоминают?
8 фев 12, 17:28    [12056686]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
StPatrick
Member

Откуда:
Сообщений: 28
iap
StPatrick
пропущено...

может быть, у него задача о днях рождениях сообщать -> вытащить все даты рождения в текущем году.
А с родившимися 29 февраля как же?
Или о них раз в четыре года вспоминают?

я бы раз в четыре года вспоминал, а как еще с ними поступать.
а на практике - скорее всего - 1 марта 2013 вспомнят, когда они напомнят :)
8 фев 12, 17:30    [12056703]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

Откуда:
Сообщений: 8711
StPatrick
может быть, у него задача о днях рождениях сообщать -> вытащить все даты рождения в текущем году.

Ага, особенно людей, родившихся в 18-19 веках. Но если у него действительно такая задача - значит проблема високосного года обязательно возникнет.
8 фев 12, 17:31    [12056716]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
Tester666
Member

Откуда:
Сообщений: 179
Вы правы, задача действительно разовая..работаем с тестовыми данными и надо было их исправить.
Все получилось следующим образом:
 UPDATE [table]
   SET [dtPlandateFinish] = DATEADD(YEAR, DATEDIFF(YEAR,dtPlandateFinish,'2012'), dtPlandateFinish)
 WHERE year(dtPlandateFinish) like '18%' or year(dtPlandateFinish) like '17%'

Всем спасибо за участие!
9 фев 12, 07:41    [12059169]     Ответить | Цитировать Сообщить модератору
 Re: заменить год в дате  [new]
iljy
Member

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

никогда не используйте таких условий. Помимо того, что в данном случае оно весьма избыточно (достаточно простого dtPlandateFinish <'1900'), в таком виде оно еще и напрочь убивает любую возможность использования индексов.
9 фев 12, 09:25    [12059350]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить