Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
Xperia
Guest
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)   Sep 16 2010 19:43:16   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

Когда задаю с 1.1.2011 по 30.6.2011 нормально срабатывает, когда задам допустим с 11.1.2011 по 28.6.2011
он также начинает с 1.1.2011 и заканчивает 30.6.2011, хотя должен начать с 11.1.2011 и закончить 28.6.2011

declare @fdate datetime,@Ldate datetime
set dateformat dmy
set @fdate='1/1/2011'
set @Ldate='30/6/2011'

declare @firstdate datetime, @Lastdate datetime,@n int,@DateVr datetime
declare @t table (FirstDate datetime,LastDate datetime)
set @n=0
while @n<=datediff(month,@fdate,@Ldate)
begin
set @DateVr=DATEADD(MONTH,@n,@fdate)
set @firstdate=dateadd(day,1-day(@DateVr),@DateVr)
set @Lastdate=dateadd(d,-1,DATEADD(MONTH,1,@firstdate))
insert into @t (FirstDate,LastDate)
select @firstdate,@Lastdate
set @n=@n+1
end

select *
from @t

Помогите пожалуйста с циклом. Не могу догнать, какое проверочное условие поставить, чтобы он начал не с 1, а с того числа, которое задаст пользователь и закончит датой заданной пользователем
8 сен 11, 12:57    [11246783]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
iljy
Member

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

а что должно получться-то?
8 сен 11, 13:14    [11246924]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
Хperia
Guest
iljy
Xperia,

а что должно получться-то?

Если задам с 11.1.2011 по 28.6.2011 то вот это:
2011-01-11 	  2011-01-31 
2011-02-01 	  2011-02-28 
2011-03-01 	  2011-03-31 
2011-04-01 	  2011-04-30 
2011-05-01 	  2011-05-31 
2011-06-01 	  2011-06-28 
8 сен 11, 13:18    [11246968]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
Glory
Member

Откуда:
Сообщений: 104751
проверять @Lastdate на не превышение @Ldate
8 сен 11, 13:32    [11247102]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
mike909
Member

Откуда:
Сообщений: 662
Xperia
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)   Sep 16 2010 19:43:16   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

Когда задаю с 1.1.2011 по 30.6.2011 нормально срабатывает, когда задам допустим с 11.1.2011 по 28.6.2011
он также начинает с 1.1.2011 и заканчивает 30.6.2011, хотя должен начать с 11.1.2011 и закончить 28.6.2011

declare @fdate datetime,@Ldate datetime
set dateformat dmy
set @fdate='1/1/2011'
set @Ldate='30/6/2011'

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

;with L0 as (select 0 as N union all select 0),
      L1 as (select 0 as N from L0 as t1 cross join L0 as t2),
      L2 as (select 0 as N from L1 as t1 cross join L1 as t2),
      L3 as (select 0 as N from L2 as t1 cross join L2 as t2),
      L4 as (select 0 as N from L3 as t1 cross join L3 as t2),
      L5 as (select row_number() over(order by t1.N) as [N] from L4 as t1 cross join L4 as t2)
SELECT 
	 CASE m.N when 1 then @fdate else m.m end
	,CASE m.N when c.cnt then @Ldate else DateAdd( day, -1, DateAdd(month,1,m.m) ) end
FROM (
  SELECT DateDiff(month, @fdate, @Ldate) + 1 as [cnt]
) as c
cross apply(
  select top( c.cnt ) N.N,  DateAdd(month, datediff(month, 0, @fdate) + N.N-1, 0) as [m]
  from L5 as N	
) as m
8 сен 11, 13:47    [11247240]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
iljy
Member

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

declare @fdate datetime,@Ldate datetime, @FMonth datetime
set dateformat dmy
set @fdate='6/1/2011'
set @Ldate='28/6/2011'
set @FMonth = DATEADD(m,datediff(m,0,@fdate),0)

;with Numbers as(
	select top(datediff(month, @fdate, @ldate) + 1) ROW_NUMBER() over(order by (select 1)) - 1 N
	from sys.objects o1,sys.objects o2,sys.objects o3
)
select case when s < @fdate then @fdate else s end s, case when e > @Ldate then @Ldate else e end e
from(
	select DATEADD(M, N, @FMonth) s, DATEADD(M, N+1, @FMonth)-1 e
	from Numbers
)t
8 сен 11, 13:50    [11247264]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
Xperia
Guest
Спасибо. Но мне нужно именно через цикл While. Т.е. дополнить, существующий запрос.
8 сен 11, 14:00    [11247355]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Xperia,
declare @fdate datetime,@Ldate datetime
set dateformat dmy
set @fdate='11/1/2011'
set @Ldate='25/6/2011'

declare @firstdate datetime, @Lastdate datetime,@n int,@DateVr datetime
declare @t table (FirstDate datetime,LastDate datetime)
set @n=0
while @n<=datediff(month,@fdate,@Ldate)
begin
set @DateVr=DATEADD(MONTH,@n,@fdate)
set @firstdate=case when @Fdate>=dateadd(day,1-day(@DateVr),@DateVr) then @fdate else dateadd(day,1-day(@DateVr),@DateVr) end
set @Lastdate=case when @Ldate<=dateadd(month,1,dateadd(day,1-day(@firstdate),@firstdate))-1 then @Ldate else dateadd(month,1,dateadd(day,1-day(@firstdate),@firstdate))-1 end
insert into @t (FirstDate,LastDate)
select @firstdate,@Lastdate
set @n=@n+1
end

select *
from @t
8 сен 11, 14:15    [11247521]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
ошибка в этой строке
set @firstdate=dateadd(day,1-day(@DateVr),@DateVr)


Нужно перед циклом написать
set @firstdate=@fdate
а в цикле заменить на
set @firstdate= dateadd(MONTH,@n,@firstdate)
8 сен 11, 14:19    [11247558]     Ответить | Цитировать Сообщить модератору
 Re: Операция с датами, разбивка по месяцам, заданного пользователем периодом  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
trew
ошибка в этой строке
set @firstdate=dateadd(day,1-day(@DateVr),@DateVr)


Нужно перед циклом написать
set @firstdate=@fdate
а в цикле заменить на
set @firstdate= dateadd(MONTH,@n,@firstdate)
ну да можно было и без временной переменной. :)
declare @fdate datetime,@Ldate datetime
set dateformat dmy
set @fdate='11/1/2011'
set @Ldate='25/6/2011'

declare @firstdate datetime, @Lastdate datetime,@n int
declare @t table (FirstDate datetime,LastDate datetime)
set @n=0
set @firstdate=@fdate
while @n<=datediff(month,@fdate,@Ldate)
begin
set @firstdate=DATEADD(MONTH,@n,@fdate)
set @firstdate=case when @Fdate>=dateadd(day,1-day(@firstdate),@firstdate) then @fdate else dateadd(day,1-day(@firstdate),@firstdate) end
set @Lastdate=case when @Ldate<=dateadd(month,1,dateadd(day,1-day(@firstdate),@firstdate))-1 then @Ldate else dateadd(month,1,dateadd(day,1-day(@firstdate),@firstdate))-1 end
insert into @t (FirstDate,LastDate)
select @firstdate,@Lastdate
set @n=@n+1
end

select *
from @t
8 сен 11, 14:25    [11247614]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить