powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
8 сообщений из 8, страница 1 из 1
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825688
Фотография Romka-Fes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем дня (вс)!
Вот есть код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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. Задача - получить список количеств дней, по месяцам, между двумя датами.
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825707
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romka-FesТ.е. проблема в том, когда начало периода совпадает с последней датой месяца, этого месяца в результате запроса - нет.
нет, у тебя другая проблема
Если @Target_Start_Date и @Target_End_Date - не совпадают, то твой запрос, всегда врет на один день !

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



так будет правильно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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)



пс
но в целом, какой-то "дикий" подход к решению исходного "получить список количеств дней, по месяцам, между двумя датами" ...
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825710
Фотография Romka-Fes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825726
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romka-Fesp.s. Есть предложение "не дикого" подхода? :)

нуу например

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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



idfdldMYPeriodDays12018-09-30 00:00:00.0002018-09-30 00:00:00.00092018122018-10-01 00:00:00.0002018-10-31 00:00:00.0001020183132018-11-01 00:00:00.0002018-11-30 00:00:00.0001120183042018-12-01 00:00:00.0002018-12-31 00:00:00.0001220183152019-01-01 00:00:00.0002019-01-31 00:00:00.000120193162019-02-01 00:00:00.0002019-02-28 00:00:00.000220192872019-03-01 00:00:00.0002019-03-31 00:00:00.000320193182019-04-01 00:00:00.0002019-04-30 00:00:00.000420193092019-05-01 00:00:00.0002019-05-22 00:00:00.0005201922
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825750
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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;



Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825756
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romka-Fescourt,
Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)
Сделать табличку - календарь...
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825769
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserRomka-Fescourt,
Спасибо за ответ!
p.s. Есть предложение "не дикого" подхода? :)
Сделать табличку - календарь...+1
Зачем каждый раз заполнять табличку с помощью какого то вычисления? Может, число Пи тоже вычислять каждый раз, когда оно понадобится?
...
Рейтинг: 0 / 0
Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
    #39825791
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Если есть таблица-календарь, то для решение данной задачи можно получить без вычислений?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избитая тема про даты, месяцы, и кол-ва дней в месяцах.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]