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

Откуда: Kyiv
Сообщений: 456
Доброго всем дня (вс)!
Вот есть код:

declare  @Target_Start_Date date ,@Target_End_Date date 

select @Target_Start_Date = '2018-09-30' ,@Target_End_Date = '2019-05-22'

select   row_number() over (order by (select NULL)) AS id, month(dt) [Month], year(dt) [Year], count(*) as PeriodDays
		from (
				select top (
					CASE 
						WHEN  
							( datediff(d, @Target_Start_Date,@Target_End_Date) = 0 )
						THEN 1 
					ELSE 
						datediff(d, @Target_Start_Date,@Target_End_Date)   
					END 
				)  dateadd(d,  row_number() over (order by (select null)), @Target_Start_Date) dt
				from sys.columns
				) q
		group by year(dt), month(dt)

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

p.s. Задача - получить список количеств дней, по месяцам, между двумя датами.
12 июн 19, 11:31    [21907225]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
court
Member

Откуда:
Сообщений: 2018
Romka-Fes
Т.е. проблема в том, когда начало периода совпадает с последней датой месяца, этого месяца в результате запроса - нет.

нет, у тебя другая проблема
Если @Target_Start_Date и @Target_End_Date - не совпадают, то твой запрос, всегда врет на один день !

врет из-за этого
Romka-Fes
dateadd(d,  row_number() over (order by (select null)), @Target_Start_Date)


так будет правильно
select   row_number() over (order by (select NULL)) AS id, month(dt) [Month], year(dt) [Year], count(*) as PeriodDays
		from (
				select top ( 
						datediff(d, @Target_Start_Date,@Target_End_Date) +1  
				)  dateadd(d,  row_number() over (order by (select null))-1, @Target_Start_Date) dt
				from sys.columns
				) q
		group by year(dt), month(dt)


пс
но в целом, какой-то "дикий" подход к решению исходного "получить список количеств дней, по месяцам, между двумя датами" ...
12 июн 19, 11:58    [21907246]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
court,

Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)
12 июн 19, 12:06    [21907250]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
court
Member

Откуда:
Сообщений: 2018
Romka-Fes
p.s. Есть предложение "не дикого" подхода? :)


нуу например

declare  @Target_Start_Date datetime ,@Target_End_Date datetime

select @Target_Start_Date = '20180930' ,@Target_End_Date = '20190522'

;with cte as (
	select
		fd		=@Target_Start_Date
		,ld		=case when dateadd(day,-1, convert(char(6), dateadd(month,1,@Target_Start_Date),112)+'01')>@Target_End_Date then @Target_End_Date else dateadd(day,-1, convert(char(6), dateadd(month,1,@Target_Start_Date),112)+'01') end

	union all
	
	select
		dateadd(day,1,ld)
		,case when dateadd(day,-1, convert(char(6), dateadd(month,1,dateadd(day,1,ld)),112)+'01')>@Target_End_Date then @Target_End_Date else dateadd(day,-1, convert(char(6), dateadd(month,1,dateadd(day,1,ld)),112)+'01') end			 
	from cte 
	where ld<@Target_End_Date
)
select
	id				=row_number()over(order by fd)  
	,fd
	,ld
	,M				=month(ld)
	,Y				=year(ld)
	,PeriodDays		=datediff(d, fd, ld)+1
from cte


idfdldMYPeriodDays
12018-09-30 00:00:00.0002018-09-30 00:00:00.000920181
22018-10-01 00:00:00.0002018-10-31 00:00:00.00010201831
32018-11-01 00:00:00.0002018-11-30 00:00:00.00011201830
42018-12-01 00:00:00.0002018-12-31 00:00:00.00012201831
52019-01-01 00:00:00.0002019-01-31 00:00:00.0001201931
62019-02-01 00:00:00.0002019-02-28 00:00:00.0002201928
72019-03-01 00:00:00.0002019-03-31 00:00:00.0003201931
82019-04-01 00:00:00.0002019-04-30 00:00:00.0004201930
92019-05-01 00:00:00.0002019-05-22 00:00:00.0005201922
12 июн 19, 12:24    [21907269]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Можно так:

declare @d1 date = '20180930', @d2 date = '20190522';

with A as (
 select @d1 as d
 union all
 select top 10 dateadd(MONTH, number, dateadd(day, 1, eomonth(@d1, -1)))
   from  master.dbo.spt_values
   where type='P' and number>0 and dateadd(MONTH, number, dateadd(day, 1, eomonth(@d1, -1)))<@d2
) -- select * from A;

, B as (
  select d 
        ,lead(d) over(order by d) as ld
  from A
) -- select * from B

select d                                              as Start_Date,
       isnull(eomonth(ld,-1), @d2)                    as End_Date,
       datediff(dd, d, isnull(eomonth(ld,-1), @d2))+1 as dayInMonth
  from B;


Результат:
Start_Date	End_Date	dayInMonth
2018-09-30 2018-09-30 1
2018-10-01 2018-10-31 31
2018-11-01 2018-11-30 30
2018-12-01 2018-12-31 31
2019-01-01 2019-01-31 31
2019-02-01 2019-02-28 28
2019-03-01 2019-03-31 31
2019-04-01 2019-04-30 30
2019-05-01 2019-05-22 22
12 июн 19, 14:27    [21907298]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Romka-Fes
court,
Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)

Сделать табличку - календарь...
12 июн 19, 14:51    [21907308]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
buser
Romka-Fes
court,
Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)

Сделать табличку - календарь...
+1
Зачем каждый раз заполнять табличку с помощью какого то вычисления? Может, число Пи тоже вычислять каждый раз, когда оно понадобится?
12 июн 19, 15:46    [21907326]     Ответить | Цитировать Сообщить модератору
 Re: Избитая тема про даты, месяцы, и кол-ва дней в месяцах.  [new]
Wlr-l
Member

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

Если есть таблица-календарь, то для решение данной задачи можно получить без вычислений?
12 июн 19, 16:47    [21907356]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить