powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне
33 сообщений из 33, показаны все 2 страниц
Cгенерить все вторники в заданном диапазоне
    #40080622
newbie876454
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой?
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080626
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если "на проклятом острове нет календаря", то можно так:

1. Выписываешь все числа от дата1 до дата2, включая эти даты

2. Двигаясь от даты1 к дате2 находишь первый вторник и отмечаешь его кружком.

3. Двигаясь от найденного вторника к дате2 отмечаешь кружком каждую 7-ю дату

4. Выписываешь отмеченные кружком даты
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080629
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454,

достаточно найти разницу между днём недели указанной даты и вторником, прибавить 7 * N для других вторников.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080647
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
newbie876454
что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой?

Тупо, брутально, в стиле "идите на ...й", неоптимально.
... Чтобы только полюбоваться на охреневшую физиономию того, кто будет делать код-ревью.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set language russian;
Declare @d1 date = '20210101', @d2 date = '20220304'

; With interval as
	(select @d1 [day]
		Union all 
	Select dateadd(day, 1, [day])
	from interval
	Where [day] < @d2
	)
Select * from interval a
Where DATEPART(weekday, [day]) = 2
Option (maxrecursion 0)


:-))))
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080649
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080650
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andy st
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt


Опа!
... в копилку...
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080681
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
newbie876454
что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой?

Тупо, брутально, в стиле "идите на ...й", неоптимально.
... Чтобы только полюбоваться на охреневшую физиономию того, кто будет делать код-ревью.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set language russian;
Declare @d1 date = '20210101', @d2 date = '20220304'

; With interval as
	(select @d1 [day]
		Union all 
	Select dateadd(day, 1, [day])
	from interval
	Where [day] < @d2
	)
Select * from interval a
Where DATEPART(weekday, [day]) = 2
Option (maxrecursion 0)


:-))))



Офигенно! И ведь будет работать! Главное ведь в коде что? Предсказуемость результатов! :) А прибавление по одному дню - это самое надёжное, что может быть!
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080683
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080691
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Кесарь,

Загляните сюда

https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ?????????


1. Выше моё сообщение - это была шутка...

2. Ну вы даёте. Я конечно тоже было дело генерировал последовательность дат, но там был просто типа массив с одним полем и небольшим диапазоном. А вот чтобы ТАК... ооо.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080697
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin
Кесарь,
Загляните сюда
https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ?????????

круто, но тут еще нету вариантов, когда месяц может начинаться 1 числа в 8 утра или 26 числа предыдущего месяца.
а некоторые конторы умудряются в разных подразделениях делать отчётность двумя способами (больше не видел) и в эксельках за большие интервалы времени у них будет сходиться до знаков после запятой.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080719
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin
Кесарь,

Загляните сюда

https://www.sql.ru/forum/1097504/vuha-dlya-kalendarya?hl=????? ??? ?????????

Наш человек!
Кстати, я поступил ровно также.
Только круче, просто нагенерировав таблицу примерно аналогичного формата с 01.01.1900 по 31.12.2100, и горя не знаю.
Проставив там сразу "первое число месяца", "последнее число месяца", "первый понедельник месяца", "рабочий день" (Кстати, кому надо, беру вот отсюда: https://data.gov.ru/opendata/resource/8ba5011a-233e-4e01-a1d2-ff5598d0f34f#2/0.0/0.0
И прямо из csv проставляю:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
;With 
[Calendar] as (
SELECT * 
FROM (
VALUES 
 (1, 1999,'1,2,3,4,6*,7,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,24,25,30*','1,2,3,4,8,9,10,15,16,22,23,29,30','5,6,11*,12,13,14,19,20,26,27','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,8,13,14,20,21,27,28','4,5,11,12,13,18,19,25,26,31*',251,114,2004,1807.2,1204.8					)
,(2, 2000,'1,2,3,4,6*,7,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','4,5,7*,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','1,2,6,7,8*,9,13,14,20,21,27,28','3,4,10,11,12,17,18,24,25','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29','4,5,7,11,12,18,19,25,26','2,3,9,10,11*,12,16,17,23,24,30,31',250,116,1995,1800,1200						)
,(3, 2001,'1,2,6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,24,25','3,4,7*,8,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29,30*','1,2,5,6,8*,9,12,13,19,20,26,27','2,3,9,10,11*,12,16,17,23,24,30','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,6*,7,10,11,17,18,24,25','1,2,8,9,12,15,16,22,23,29,30',251,114,2001,1807.2,1204.8					)
,(4, 2002,'1,2,5,6,7,12,13,19,20,26,27','2,3,9,10,16,17,22*,23,24,25','2,3,7*,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,28,30*','1,2,3,4,5,8*,9,10,11,12,19,25,26','1,2,8,9,11*,12,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,6*,7,8,9,16,17,23,24,30','1,7,8,11*,12,13,14,21,22,28,29,31*',250,115,1992,1792,1192			)
,(5, 2003,'1,2,3,5*,6,7,11,12,18,19,25,26','1,2,8,9,15,16,22,23,24','1,2,7*,8,9,10,15,16,22,23,29,30','5,6,12,13,19,20,26,27,30*','1,2,3,4,8*,9,10,11,17,18,24,25,31','1,7,8,11*,12,13,14,15,22,28,29','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,6*,7,8,9,15,16,22,23,29,30','6,7,11*,12,13,14,20,21,27,28,31*',250,115,1992,1792,1192			)
,(6, 2004,'1,2,3,4,6*,7,10,11,17,18,24,25,31','1,7,8,14,15,21,22,23,28,29','6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,24,25,30*','1,2,3,4,8,9,10,15,16,22,23,29,30','5,6,11*,12,13,14,19,20,26,27','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,8,13,14,20,21,27,28','4,5,11,12,13,18,19,25,26,31*',251,115,2004,1803.2,1200.8				)
,(7, 2005,'1,2,3,4,5,6,7,8,9,10,15,16,22,23,29,30','5,6,12,13,19,20,22*,23,26,27','5*,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,2,7,8,9,14,15,21,22,28,29','4,5,11,12,13,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29,30','3*,4,5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31',248,117,1981,1782.6,1187.4					)
,(8, 2006,'1,2,3,4,5,6,7,8,9,14,15,21,22,28,29','4,5,11,12,18,19,22*,23,24,25','4,5,7*,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','1,6*,7,8,9,13,14,20,21,27,28','3,4,10,11,12,17,18,24,25','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29','3*,4,5,6,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31',248,117,1981,1782.6,1187.4					)
,(9, 2007,'1,2,3,4,5,6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,22*,23,24,25','3,4,7*,8,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28*,29,30','1,5,6,8*,9,12,13,19,20,26,27','2,3,9*,10,11,12,16,17,23,24,30','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,5,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29*,30,31',249,116,1986,1786.8,1189.2			)
,(10, 2008,'1,2,3,4,5,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,22*,23,24,25','1,2,7*,8,9,10,15,16,22,23,29,30','5,6,12,13,19,20,26,27,30*','1,2,3,8*,9,10,11,17,18,24,25,31','1,8,11*,12,13,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1*,2,3,4,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28,31*',250,116,1993,1793,1193			)
,(11, 2009,'1,2,3,4,5,6,7,8,9,10,17,18,24,25,31','1,7,8,14,15,21,22,23,28','1,7,8,9,14,15,21,22,28,29','4,5,11,12,18,19,25,26','1,2,3,8*,9,10,11,16,17,23,24,30,31','6,7,11*,12,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31','1,3*,4,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27,31*',249,116,1987,1787.8,1190.2					)
,(12, 2010,'1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,22,23,27*,28','6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,24,25,30*','1,2,3,8,9,10,15,16,22,23,29,30','5,6,11*,12,13,14,19,20,26,27','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31','3*,4,5,6,7,14,20,21,27,28','4,5,11,12,18,19,25,26,31*',249,116,1987,1787.8,1190.2			)
,(13, 2011,'1,2,3,4,5,6,7,8,9,10,15,16,22,23,29,30','5,6,12,13,19,20,22*,23,26,27','5*,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,2,7,8,9,14,15,21,22,28,29','4,5,11,12,13,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29,30','3*,4,5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31',248,117,1981,1782.6,1187.4					)
,(14, 2012,'1,2,3,4,5,6,7,8,9,14,15,21,22,28,29','4,5,11,12,18,19,22*,23,25,26','3,4,7*,8,9,10,17,18,24,25,31','1,7,8,14,15,21,22,28*,29,30','1,6,7,8,9,12*,13,19,20,26,27','2,3,9*,10,11,12,16,17,23,24,30','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,5,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29*,30,31',249,117,1986,1786.8,1189.2			)
,(15, 2013,'1,2,3,4,5,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,22*,23,24','2,3,7*,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','1,2,3,4,5,8*,9,10,11,12,18,19,25,26','1,2,8,9,11*,12,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,4,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29,31*',247,118,1970,1772.4,1179.6			)
,(16, 2014,'1,2,3,4,5,6,7,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,24*','1,2,7*,8,9,10,15,16,22,23,29,30','5,6,12,13,19,20,26,27,30*','1,2,3,4,8*,9,10,11,17,18,24,25,31','1,7,8,11*,12,13,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,3,4,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28',247,118,1970,1772.4,1179.6			)
,(17, 2015,'1,2,3,4,5,6,7,8,9,10,11,17,18,24,25,31','1,7,8,14,15,21,22,23,28','1,7,8,9,14,15,21,22,28,29','4,5,11,12,18,19,25,26,30*','1,2,3,4,8*,9,10,11,16,17,23,24,30,31','6,7,11*,12,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31','1,3*,4,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27,31*',247,118,1971,1773.4,1180.6		)
,(18, 2016,'1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31','6,7,13,14,20*,21,22,23,27,28','5,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,2,3,7,8,9,14,15,21,22,28,29','4,5,11,12,13,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29,30','3*,4,5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31',247,119,1974,1776.4,1183.6					)
,(19, 2017,'1,2,3,4,5,6,7,8,14,15,21,22,28,29','4,5,11,12,18,19,22*,23,24,25,26','4,5,7*,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','1,6,7,8,9,13,14,20,21,27,28','3,4,10,11,12,17,18,24,25','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29','3*,4,5,6,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31',247,118,1973,1775.4,1182.6					)
,(20, 2018,'1,2,3,4,5,6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,22*,23,24,25','3,4,7*,8,9,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28*,29,30','1,2,5,6,8*,9,12,13,19,20,26,27','2,3,9*,10,11,12,16,17,23,24,30','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,5,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29*,30,31',247,118,1970,1772.4,1179.6		)
,(21, 2019,'1,2,3,4,5,6,7,8,12,13,19,20,26,27','2,3,9,10,16,17,22*,23,24','2,3,7*,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28,30*','1,2,3,4,5,8*,9,10,11,12,18,19,25,26','1,2,8,9,11*,12,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,4,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29,31*',247,118,1970,1772.4,1179.6		)
,(22, 2020,'1,2,3,4,5,6,7,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,24+,29','1,7,8,9+,14,15,21,22,28,29','4,5,11,12,18,19,25,26,30*','1,2,3,4+,5+,8*,9,10,11+,16,17,23,24,30,31','6,7,11*,12,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31','1,3*,4,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27,31*',248,118,1979,1780.6,1185.4	)
,(23, 2021,'1,2,3,4,5,6,7,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,22*,23,27,28','6,7,8*,13,14,20,21,27,28','3,4,10,11,17,18,24,25,30*','1,2,3+,8,9,10+,15,16,22,23,29,30','5,6,11*,12,13,14+,19,20,26,27','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','4,5,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31','3*,4,6,7,13,14,20,21,27,28','4,5,11,12,18,19,25,26,31*',249,116,1987,1787.8,1190.2		)
,(24, 2022,'1,2,3,4,5,6,7,8,9,15,16,22,23,29,30','5,6,12,13,19,20,22*,23,26,27','5,6,7*,8,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,2+,7,8,9,14,15,21,22,28,29','4,5,11,12,13+,18,19,25,26','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25','1,2,8,9,15,16,22,23,29,30','3*,4,5,6,12,13,19,20,26,27','3,4,10,11,17,18,24,25,31',249,116,1989,1789.8,1192.2					)
,(25, 2023,'1,2,3,4,5,6,7,8,14,15,21,22,28,29','4,5,11,12,18,19,22*,23,25,26','4,5,7*,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,29,30','1,6,7,8*,9,13,14,20,21,27,28','3,4,10,11,12,17,18,24,25','1,2,8,9,15,16,22,23,29,30','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29','3*,4,5,6+,11,12,18,19,25,26','2,3,9,10,16,17,23,24,30,31',249,116,1988,1788.8,1191.6					)
,(26, 2024,'1,2,3,4,5,6,7,8,13,14,20,21,27,28','3,4,10,11,17,18,22*,23,24,25','2,3,7*,8,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28,30*','1,4,5,8*,9,11,12,18,19,25,26','1,2,8,9,11*,12,15,16,22,23,29,30','6,7,13,14,20,21,27,28','3,4,10,11,17,18,24,25,31','1,7,8,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,4,9,10,16,17,23,24,30','1,7,8,14,15,21,22,28,29,31*',250,116,1994,1794,1194				)
,(27, 2025,'1,2,3,4,5,6,7,8,11,12,18,19,25,26','1,2,8,9,15,16,22,23,24+','1,2,7*,8,9,10+,15,16,22,23,29,30','5,6,12,13,19,20,26,27,30*','1,3,4,8*,9,10,11,17,18,24,25,31','1,7,8,11*,12,14,15,21,22,28,29','5,6,12,13,19,20,26,27','2,3,9,10,16,17,23,24,30,31','6,7,13,14,20,21,27,28','4,5,11,12,18,19,25,26','1,2,3*,4,8,9,15,16,22,23,29,30','6,7,13,14,20,21,27,28,31*',249,116,1986,1786.8,1189.2			)

) AS vtable 
([Код],[Год],[Январь],[Февраль],[Март],[Апрель],[Май],[Июнь],[Июль],[Август],[Сентябрь],[Октябрь],[Ноябрь],[Декабрь], [ВсегоДней], [Выходных], [Часов40], [Часов36], [Часов24])
),
d as 
(Select Cast(DATEFROMPARTS(
	       b.[Год]
		  ,b.[Месяц]
		  ,Cast(Ltrim(Rtrim(Replace(Replace(t.Item, N'*',''), N'+', N''))) as int))
		 as date) [date_n]
		 ,Case 
			when t.Item like N'%*%' then 1
			when t.Item like N'%+%' then 0
		  Else 0
		  END IsWorkDay
	from ([Calendar] a
			Cross apply 
			(Values (a.[Год], 1, a.[Январь]),
					(a.[Год], 2, a.[Февраль]),
					(a.[Год], 3, a.[Март]),
					(a.[Год], 4, a.[Апрель]),
					(a.[Год], 5, a.[Май]),
					(a.[Год], 6, a.[Июнь]),
					(a.[Год], 7, a.[Июль]),
					(a.[Год], 8, a.[Август]),
					(a.[Год], 9, a.[Сентябрь]),
					(a.[Год], 10, a.[Октябрь]),
					(a.[Год], 11, a.[Ноябрь]),
					(a.[Год], 12, a.[Декабрь])) b([Год], [Месяц], [Дни]))
			Cross apply [common].[fnSplitString](b.[Дни], ',') t
)
Update a
Set [isWorkDay]=IsNull(d.[isWorkDay], 1)
from [spr].[calendar] a left join d on a.[date_n] = d.[date_n]
Where a.[year] between 1999 and 2025
Option(recompile)



, предыдущий день, следующий рабочий день, и тому подобные поля.
И таскаю с собой в "служебной" бд, по всем серверам организации. Ну, восстанавливаю из единого источника периодически.
Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом.
Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить.
:-)))
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080724
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом.
Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить.
:-)))




Кстати вполне разумная мысль, подумал об этом же, что мс серверу иметь такую готовую таблицу из коробки и штатные средства её заполнения было бы полезно. Ибо используется много кем, да почти что всеми.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080725
svb2018
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня похожий вопрос, только для четвергов...
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080744
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svb2018
у меня похожий вопрос, только для четвергов...

Двойку на четверку поменять - не судьба?
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40080756
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
uaggster
Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом.
Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить.
:-)))




Кстати вполне разумная мысль, подумал об этом же, что мс серверу иметь такую готовую таблицу из коробки и штатные средства её заполнения было бы полезно. Ибо используется много кем, да почти что всеми.

Ты не поверишь, но в учебной стандартной AdventureWorksDW базе уже есть DimDate календарь, заполненный со всем что надо.
авторCREATE TABLE [dbo].[DimDate](
[DateKey] [int] NOT NULL,
[FullDateAlternateKey] [date] NOT NULL,
[DayNumberOfWeek] [tinyint] NOT NULL,
[EnglishDayNameOfWeek] [nvarchar](10) NOT NULL,
[SpanishDayNameOfWeek] [nvarchar](10) NOT NULL,
[FrenchDayNameOfWeek] [nvarchar](10) NOT NULL,
[DayNumberOfMonth] [tinyint] NOT NULL,
[DayNumberOfYear] [smallint] NOT NULL,
[WeekNumberOfYear] [tinyint] NOT NULL,
[EnglishMonthName] [nvarchar](10) NOT NULL,
[SpanishMonthName] [nvarchar](10) NOT NULL,
[FrenchMonthName] [nvarchar](10) NOT NULL,
[MonthNumberOfYear] [tinyint] NOT NULL,
[CalendarQuarter] [tinyint] NOT NULL,
[CalendarYear] [smallint] NOT NULL,
[CalendarSemester] [tinyint] NOT NULL,
[FiscalQuarter] [tinyint] NOT NULL,
[FiscalYear] [smallint] NOT NULL,
[FiscalSemester] [tinyint] NOT NULL,
CONSTRAINT [PK_DimDate_DateKey] PRIMARY KEY CLUSTERED
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081333
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос был о вторниках.

Я привел способ нахождения вторников, который в математике называется решетом, и известный нам еще со школы. Авторство этого способа приписывают древнегреческому математику Эратосфену. Этот способ им был использован для нахождения простых чисел. https://ru.wikipedia.org/wiki/Решето_Эратосфена

В этой статье приведена анимационная картинка, демонстрирующая работу этого способа. Очень наглядно!
Все шаги, кроме шага 2, выполняются механически, поэтому этот способ часто называют алгоритмом.
В пункте 1 я оговорился, написав "число", хотя речь идет о датах. Наверно, мысли были уже о реализации этого способа для вторников.

Привели два варианта решения задачи нахождения вторников, которые детализируют этот способ, причем второй вариант доведен до реального запроса. Кесарю этот запрос очень понравился, но когда он увидел календарь Воронина, сразу отрекся! И началось соревнование представителей островов, у кого длиннее календарь, в смысле у кого в нем больше всякой всячины, нужной и не очень нужной. Особенно поразила таблица DimDate из AdventureWorksDW: в ней название дня недели и на английском, и на испанском, и на французcком. Все, что надо для нашей глубинки!

Но наличие календаря с нужными для нас данными не отменяет вопрос, как всё-таки сгенерировать эти очень нужные нам вторники? Потом, если задача со вторниками регулярная, то почему бы не сделать для них отдельную таблицу вторников?

Трансформируем способ решета в запрос получения вторников начиная с 2021 года и лет так на 90:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @tueBase date = '20201229';

with
 l0(n) as (select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0), 
 l1(n) as (select 0 from l0 t1 cross join l0 t2),
 l2(n) as (select 0 from l1 t1 cross join l1 t2),
 r(n)  as (select row_number() over(order by (select 0)) * 7 from l2),
 D(d)  as (select dateadd(day, n, @tueBase) from r)

select *
  from d
 where d between '20210701' and '20210731';


Результат:

2021-07-06
2021-07-13
2021-07-20
2021-07-27

'20201229' – вторник, который непосредственно предшествует нужному нам диапазону вторников (пункт 2).
Запросы l0, l1, l2 формируют нужный нам числовой ряд (пункт 1).
Запрос r обводит кружком интересующие нас точки этого числового ряда (пункт 3).
Запрос D выписывает даты, соответствующие обведенным кружкам нашего числового ряда (пункт 4).

Рекурсивная версия:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @tueBase date = '20210105', @dMax date = '20220304';

with tuesday as (
  select @tueBase as d
  union all 
  select dateadd(day, 7, d) from tuesday where d<@dMax
)
select * from tuesday a -- where d between '20210701' and '20210731'
option (maxrecursion 0);



" Вроде не бездельники и могли бы жить
Им бы вторники взять и отменить
…"

Да, вторники здесь ни при чем, скорее Эратосфен с его решетом.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081363
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @D1 DATE='20210207', @D2 DATE='20211213', @W TINYINT=1 /*вторник*/;

WITH Numbers AS(SELECT N=ROW_NUMBER()OVER(ORDER BY 1/0)-1 FROM master.dbo.spt_values)
SELECT D=DATEADD(DAY,N,@D1)
FROM Numbers
WHERE N<DATEDIFF(DAY,@D1,@D2)
  AND (@@DATEFIRST+DATEPART(WEEKDAY,DATEADD(DAY,N,@D1))-2)%7=@W
ORDER BY N;
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081392
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy st
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt



первая строка
Код: sql
1.
waitfor time


иначе функция "завтрашней даты" неправильна
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081396
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad
andy st
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt



первая строка
Код: sql
1.
waitfor time


иначе функция "завтрашней даты" неправильна

нинада "ля-ля"
результирующая дата в любом случае будет "завтрашняя"
про время в постановке задачи не было ничего
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081397
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081449
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился.
Можно было в FAQ подсмотреть!
Я там тоже писал...
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081453
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @D1 DATE='20210207', @D2 DATE='20211213', @W TINYINT=1 /*вторник*/;
with w as (Select*from(values(0),(1),(2),(3),(4),(5),(6))a(d))
 ,n as (select row_number()over(order by 1/0)-1 r from w,w a,w b,w c,w d,w e) 
 select dateadd(week,r,FirstTue)
   from n
       ,(Select dateadd(dd,d,@D1) FirstTue
           from w
          where datepart(dw,dateadd(dd,d,@D1))=datepart(dw,@W))x
  where dateadd(week,r,FirstTue)<=@D2;
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081480
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, интересное решение. Получилось немного усовершенствовать :) set statistics time on говорит что так быстрее работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @D1 DATE='20210207', @D2 DATE='20211213', @W TINYINT=1 /*вторник*/;
with 
  w as (Select *
             from (values(0),(1),(2),(3),(4),(5),(6))a(d))
 ,f as (Select dateadd(dd,d,@D1) FirstTue
            from w
            where datepart(dw,dateadd(dd,d,@D1))=datepart(dw,@W))
 ,d as (select FirstTue as Tue
            from f
          union all
          select dateadd(week,1,Tue)
            from d
            where dateadd(week,1,Tue)<=@D2)
 select *
   from d
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081482
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,

чтобы усовершенствовать, лучше взять номера из готовой таблицы, а не генерить на лету.
а в вашей рекурсии по умолчанию есть ограничение на 100 вторников, которое, впрочем, несложно убрать.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081483
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель, рекурсия рассчитает дату 100 раз (ну или сколько требуется), а ваш запрос выполнит столько раз, сколько строк в таблице. а потом отберет те даты, которые попадают в диапазон. вычислений больше. разве не так?
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40081485
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,
максимальный нужный номер легко вычисляется при известном диапазоне дат.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082162
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap
Wlr-l
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился.
Можно было в FAQ подсмотреть!
Я там тоже писал...


Спасибо, в следующий раз обязательно загляну!

Правда, я сказал, что вторники здесь ни_при_чём. Хотел показать, что основой для решения таких задач является известный со школы алгоритм: решето Эратосфена. Причем все основные вычисления в этом решении проводятся с числами и только на последнем этапе формируются даты. Причем, в отличии от чистого решета Эратосфена, генерируется столько строк, сколько нужно сгенерировать дат.

Посетитель тоже проникся духом Эратосфена и даже автоматизировал получение базового вторника.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082175
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,
решето Эратосфена, это взять весь календарь, удалить оттуда понедельники, потом среды и т.д.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082176
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель
Wlr-l,
решето Эратосфена, это взять весь календарь, удалить оттуда понедельники, потом среды и т.д.

Зачем так много действий? Берете известный вторник и после него обводите кружком каждую седьмую дату, в оригинале выдавливаете их (отсюда и появилось решето).
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082182
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l

Зачем так много действий?


потому что алгоритм такой. взять полный набор и итерационным путем убирать лишнее.

а мое решение к решету никакого отношения не имеет.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082451
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

" потому что алгоритм такой. взять полный набор и итерационным путем убирать лишнее ".

Эратосфен решал задачу нахождения простых чисел, и вы правильно заметили, что в этом случае требуются итерации. Если взять одну итерацию, то в ней он отмечал числа, начиная с определенного числа, через соответствующие равные промежутки.

Мы решаем другую задачу: находим вторники. Для этого достаточно одной такой итерации.

Каждая итерация у Эратосфена начинается с определенного числа.
Нахождение вторников также начинается с определенного вторника.

Эратосфен отмечал числа путем зачеркивания (выдавливал ненужное), а я предложил отмечать числа кружком (выдавливать нужное) ( 22341307 ). Это несущественное отличие.

Вы делаете упор на организацию цикла, а я – на тело цикла.

" а мое решение к решету никакого отношения не имеет "

Вы можете считать так, это ваше право. Но есть вопрос: "Чем ваше решение отличается от моего ( 22342687 ), которое было дано раньше?".
Мое решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @tueBase date = '20201229';
with
 l0(n) as (select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0 union all select 0), 
 l1(n) as (select 0 from l0 t1 cross join l0 t2),
 l2(n) as (select 0 from l1 t1 cross join l1 t2),
 r(n)  as (select row_number() over(order by (select 0)) * 7 from l2),
 D(d)  as (select dateadd(day, n, @tueBase) from r)
select *
  from d
 where d between '20210701' and '20210731';


Ваше решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @D1 DATE='20210207', @D2 DATE='20211213', @W TINYINT=1 /*вторник*/;
with w as (Select*from(values(0),(1),(2),(3),(4),(5),(6))a(d))
 ,n as (select row_number()over(order by 1/0)-1 r from w,w a,w b,w c,w d,w e) 
 select dateadd(week,r,FirstTue)
   from n
       ,(Select dateadd(dd,d,@D1) FirstTue
           from w
          where datepart(dw,dateadd(dd,d,@D1))=datepart(dw,@W))x
  where dateadd(week,r,FirstTue)<=@D2;


В том, что я взял готовый базовый вторник, чтобы не загромождать пример, а вы его вычислили. Все остальное тождественно. Так я уже сказал, что вы "автоматизировали получение базового вторника".

Там же я привел рекурсивный вариант, который "переоткрыл" ваш собеседник.

И, если уж автоматически формировать базовый вторник, то
1) если взять не первый вторник после даты @D1, а последний вторник перед этой датой, то в запросе n можно убрать -1
2) лучше не вычислять часть даты от целого числа (datepart(dw, @W) – что это такое?), а воспользоваться советом iap :
Код: sql
1.
2.
3.
select dateadd(dd, -d, @D1) as FirstTue
   from (values (0), (1), (2), (3), (4), (5), (6)) as a(d)
  where (@@datefirst+datepart(weekday, dateadd(day, -d, @D1))-2)%7=@W



На этом у меня все по этой теме.
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082509
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

ну если замена итерационного подхода на неитерационный - это несущественные отличия, то вообще любой sql-запрос, содержащий предикат, это решето Эратосфена

что уж говорить о замене фильтрации на генерацию. это, видимо, тоже идентичные алгоритмы)



Wlr-l
"Чем ваше решение отличается от моего ( 22342687 ), которое было дано раньше?


принципиально - ничем. ни от вашего, ни от решения iap. И все они одинаково далеки от алгоритма, на который вы пытаетесь их натянуть.


Wlr-l
datepart(dw, @W) – что это такое?

это просто альтернативный способ получить (@@datefirst+datepart(weekday, dateadd(day, -d, @D1))-2)%7=@W без проверки настройки @@datefirst
...
Рейтинг: 0 / 0
Cгенерить все вторники в заданном диапазоне
    #40082786
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посетитель,

1. Идеи, заложенные в решете Эратосфена, оказали влияние лично на меня в плане понимания обработки периодических данных. Конечно, не только и исключительно эти.

Если вы считаете, что разработали уникальный алгоритм нахождения вторников, который не имеет предшественников, то я ни на что не претендую.

2. На решение написать это сообщение повлиял сегодняшний вопрос о разных результатах функции datepart(weekday, @DateFrom). Казалось бы, всё здесь уже оговорено, но такой вопрос периодически звучит. Вы написали:

datepart(dw, @W) – это просто альтернативный способ получить (@@datefirst+datepart(weekday, dateadd(day, -d, @D1))-2)%7=@W без проверки настройки @@datefirst.

Это не совсем так:
Код: sql
1.
2.
3.
4.
5.
DECLARE @W TINYINT=1 /*вторник*/;
set datefirst 7;
select @@DATEFIRST, datepart(dw, @W), (@@datefirst+datepart(weekday, @W)-2)%7;
set datefirst 1;
select @@DATEFIRST, datepart(dw, @W), (@@datefirst+datepart(weekday, @W)-2)%7;


7 3 1
1 2 1

Т.е. это не альтернативные способы несмотря на то, что в вашем решении получаем нужный результат.

Плюс к этому, новые типы данных для представления дат уже не воспринимают числа в качестве даты. С точки зрения строгой типизации операция взятия части даты от целого числа должна вызывать ошибку синтаксического разбора. Поэтому вместо 1 можно взять любой вторник, например,
Код: sql
1.
DECLARE @W  date = '19000102' /*в этот день был вторник*/;


и это будет понятней.

В вашем решении все-таки нужно заранее знать хотя бы одну дату вторника, а в решении iap достаточно знать константу дня недели.

Таким образом, эти два решения не альтернативны.

Теперь у меня точно всё, чтобы вторники не начали сниться по ночам.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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