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

Откуда:
Сообщений: 7
В общем, вопрос по оператору DATEADD.
Есть таблица, в первой колонке даты начала в формате хххх-хх-хх, во второй количество месяцев. Нужно создать третью колонку, с датами окончания. Все типы данных - nvarchar. Нужно менять их на smalldate и int, или и так сработает? И если пытаться добавить просто через select - ругается, что получено больше одного значения. Подозреваю, что надо джойнить. Но не до конца понимаю как именно

Ну, для примера:

DATE_BEGIN
2017-12-07
2017-02-15
2017-01-13

term_months
36
12
36

То есть в 3 колонке (DATE_END) грубо говоря должно получиться:
2020-12-07
2018-02-15
2020-01-13
21 янв 18, 22:54    [21124979]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
Для даты уже давно есть правильные типы. И в названии этих типов нет слова "char", но есть слово "date".

Сообщение было отредактировано: 21 янв 18, 23:32
21 янв 18, 23:32    [21125028]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Massa52
Member

Откуда:
Сообщений: 373
SiмbаTLM,
DECLARE @t TABLE(DATE_BEGIN NVARCHAR(10), term_months NVARCHAR(10)) 
INSERT @t (DATE_BEGIN, term_months) VALUES
('2017-12-07','36'),
('2017-02-15','12'),
('2017-01-13','36')

SELECT DATE_BEGIN, term_months, DATEADD(month, CAST(term_months AS int), CAST(DATE_BEGIN AS DATE)) AS DATE_END 
FROM @t


DATE_BEGIN term_months DATE_END
2017-12-07 36 2020-12-07
2017-02-15 12 2018-02-15
2017-01-13 36 2020-01-13
22 янв 18, 00:22    [21125076]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
SiмbаTLM
Member

Откуда:
Сообщений: 7
Огромное спасибо!
Тогда еще вопросик)

Таблица [Данные]

DATE_BEGIN -- дата начала кредита
2017-12-07
2017-02-15
2017-01-13

term_months -- срок кредита
36
12
36

AMOUNT -- сумма кредита
115000
113510
155000

INTEREST_RATE_EFFECT -- ставка
16,9
16,95
16,55

DATE_END -- дата окончания кредита
2020-12-07
2018-02-15
2020-01-13


Таблица [Table_1]

[Период]
янв.17
фев.17
мар.17
апр.17
май.17
июн.17
июл.17
авг.17
сен.17
окт.17
ноя.17
дек.17
янв.18

[Объем погашения за период] -- нужно заполнить сумму всех погашений действующих кредитов за выбранный месяц


Ну и, собственно, части паззла запроса

UPDATE [dbo].[График погашения]

SET [Объем погашения за период] = sum((SELECT [AMOUNT] from [Данные]) * (((15.00/100.00/12.00)+((15.00/100.00/12.00)/((POWER(1+(15.00/100.00/12.00),12)-1)))))) -- Формула аннуитентных платежей, только как заменить на данные из [Данные], чтобы опять не сругался на "больше одного значения"

WHERE DATE_END from [Данные] >= --Начало месяца. То есть, если фев.17, то >= '2017-02-01'
AND
WHERE DATE_BEGIN from [Данные] <= --Конец месяца. То есть, если фев.17, то <= '2017-02-01'

Собрав конструктор, получаем в поле [Объем погашений за период] WHERE [Период] = 'фев.17' месячную сумму платежей по всем действующим кредитам
22 янв 18, 18:46    [21128103]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
SiмbаTLM
Member

Откуда:
Сообщений: 7
По логике такой запрос должен подойти (после танцев с бубном - нужно для каждого периода заводить первый и последний день):

SELECT SUM(CAST (AMOUNT AS decimal(20,2))) FROM [Task2].[dbo].[Данные задача №2]
WHERE (CAST (DATE_BEGIN AS DATE)) <= --последний день периода
AND DATEADD(month, CAST(term_months AS int), CAST(DATE_BEGIN AS DATE)) >= --первый день периода

Но тип значений поля AMOUNT - varchar, при попытке изменить тип на decimal запрос выдает ошибку:
"Ошибка при преобразовании типа данных varchar к numeric"

Пытался побороть через DECLARE, так как прочитал, что нужно сначала изменить тип, а потом включать в sum. Но не помогло(
22 янв 18, 21:30    [21128326]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Massa52
Member

Откуда:
Сообщений: 373
SiмbаTLM,
Вдумайтесь - AMOUNT это сумма. Как сумма может быть varchar?
23 янв 18, 02:45    [21128685]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30786
SiмbаTLM
Но тип значений поля AMOUNT - varchar, при попытке изменить тип на decimal запрос выдает ошибку:
"Ошибка при преобразовании типа данных varchar к numeric"
Так там данные лежать кривые. Найти и поправить, потом поменять тип.
23 янв 18, 15:23    [21131147]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
SiмbаTLM
Member

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

Ага, уже сам понял, спасибо. Изменил через excel в дробных числах запятую на точку - заработало)
23 янв 18, 19:28    [21132080]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
SiмbаTLM
Member

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

Понимаю, но исходные данные заведены как раз в таких форматах
23 янв 18, 19:34    [21132091]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить