powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне
25 сообщений из 33, страница 1 из 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
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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