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

Откуда:
Сообщений: 1520
Вот такая задачка стоит:
Из таблицы где дата начала действия нового оклада представлена двумя int-полями нужно сделать таблицу с двумя полями (дата_начала и дата_окончания).
Причем если месяц например = 5 а год = 2013 до дату начала брать как последний день месяца, то есть 2013-05-31!
А дату окончания брать как дата_начала - 1. В общем как на скрине нужно сделать. Дату я смог преобразовать а вот функция lead() которая вычислит мне дату окончания - никак не хочет принимать значение даты начала..Ругается на типы.
Прошу помочь на этом простом примерчике!

К сообщению приложен файл. Размер - 28Kb
24 янв 14, 11:40    [15461583]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Добрый Э - Эх
Guest
покажи, как делал.
24 янв 14, 11:45    [15461633]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Santa89
Member

Откуда:
Сообщений: 1520
select
[Сотрудник_ID],
[Оклад],
[Дата_начала],
lead([Дата_начала],1,0) over (partition by [Сотрудник_ID] order by [Дата_начала]) [Дата_окончания] /* вот тут ошибка */
from
(
select
[Сотрудник_ID],
[Оклад],
cast(dateadd(month,1,dateadd(day,1-day([Дата_начала]),[Дата_начала]))-1 as date) [Дата_начала]
from
(
select
[Сотрудник_ID],
[Оклад],
cast([Год] as varchar(4)) + '-' + case when len([Месяц]) = 1 then '0' + cast([Месяц] as varchar(1)) else cast([Месяц] as varchar) end + '-01' [Дата_начала]
from @table
) a1
) a2
24 янв 14, 11:59    [15461789]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Santa89
Member

Откуда:
Сообщений: 1520
ну и в самом начале:

declare @table table ([Сотрудник_ID] int, [Оклад] int, [Месяц] int, [Год] int)
insert into @table
select 1, 12000, 1, 2013
union all
select 1, 15000, 5, 2013
union all
select 1, 25000, 1, 2014
24 янв 14, 12:00    [15461806]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Добрый Э - Эх
Guest
Santa89
select
[Сотрудник_ID],
[Оклад],
[Дата_начала],
lead([Дата_начала],1,0) over (partition by [Сотрудник_ID] order by [Дата_начала]) [Дата_окончания] /* вот тут ошибка */
from
(
select
[Сотрудник_ID],
[Оклад],
cast(dateadd(month,1,dateadd(day,1-day([Дата_начала]),[Дата_начала]))-1 as date) [Дата_начала]
from
(
select
[Сотрудник_ID],
[Оклад],
cast([Год] as varchar(4)) + '-' + case when len([Месяц]) = 1 then '0' + cast([Месяц] as varchar(1)) else cast([Месяц] as varchar) end + '-01' [Дата_начала]
from @table
) a1
) a2
А с каких пор число 0 стало у нас датой? Правильно LEAD ругается. Уж коли речь за даты пошла, то и подпихивай дату в отсутствующие значения LEAD-а
24 янв 14, 12:16    [15461957]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Santa89
Member

Откуда:
Сообщений: 1520
Добрый Э - Эх, не понял..
24 янв 14, 13:30    [15462528]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
prog882
Guest
Santa89,

select *, 
convert(date,'01.'+convert(varchar,t.[Месяц])+'.'+convert(varchar,t.[Год]),103) as [Дата Начала],
dateadd(day,-1,dateadd(month,1,convert(date,'01.'+convert(varchar,t.[Месяц])+'.'+convert(varchar,t.[Год]),103))) as [Дата окончания]
from @table t
24 янв 14, 13:34    [15462563]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Добрый Э - Эх
Guest
в твоем LEAD-е - два возвращаемых значения:
1) [Дата_начала], тип данных date
2) 0, тип данных int

Вот тут и рвет голову LEAD-у., ибо оба возвращаемых аргумента должны иметь одинаковый тип, о чем тебе сервер и пытается сообщить.
И тут уже нужно либо [Дата_начала] конвертировать в int, либо 0 конвертировать в date.
Чего непонятного-то?
24 янв 14, 13:37    [15462596]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Santa89
Member

Откуда:
Сообщений: 1520
Добрый Э - Эх, большое спасибо, поставил NULL, все заработало так как надо
25 янв 14, 10:27    [15466690]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Добрый Э - Эх
Guest
Santa89, Документацию почитай на досуге...

Cмысл рядить в LEAD-е конструкцию дефолтового параметра, если вместо конкретного значения возвращать NULL, который и при простой нотации LEAD-а возвращается на автомате ?
25 янв 14, 14:26    [15467465]     Ответить | Цитировать Сообщить модератору
 Re: Вроде просто, но не получается..  [new]
Lanselot
Member

Откуда:
Сообщений: 76
В 2012 есть функция eomonth:

select *, 
convert(date,'01.'+convert(varchar,t.[Месяц])+'.'+convert(varchar,t.[Год]),103) as [Дата Начала],
eomonth(convert(date,'01.'+convert(varchar,t.[Месяц])+'.'+convert(varchar,t.[Год]),103)) as [Дата окончания]
from @table t
29 янв 14, 12:02    [15487164]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить