Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне / 25 сообщений из 33, страница 1 из 2
28.06.2021, 22:43
    #40080622
newbie876454
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой?
...
Рейтинг: 0 / 0
28.06.2021, 23:27
    #40080626
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Если "на проклятом острове нет календаря", то можно так:

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

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

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

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

достаточно найти разницу между днём недели указанной даты и вторником, прибавить 7 * N для других вторников.
...
Рейтинг: 0 / 0
29.06.2021, 08:37
    #40080647
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
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
29.06.2021, 08:52
    #40080649
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt
...
Рейтинг: 0 / 0
29.06.2021, 08:54
    #40080650
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
andy st
uaggster,
это случаем не твоя функция получения завтрашней даты?
Код: sql
1.
2.
3.
waitfor delay '23:59:59'
waitfor delay '00:00:01'
select getdate() dt


Опа!
... в копилку...
...
Рейтинг: 0 / 0
29.06.2021, 12:22
    #40080681
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
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
29.06.2021, 12:24
    #40080683
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
...
Рейтинг: 0 / 0
29.06.2021, 12:59
    #40080691
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
a_voronin
Кесарь,

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

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


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

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

круто, но тут еще нету вариантов, когда месяц может начинаться 1 числа в 8 утра или 26 числа предыдущего месяца.
а некоторые конторы умудряются в разных подразделениях делать отчётность двумя способами (больше не видел) и в эксельках за большие интервалы времени у них будет сходиться до знаков после запятой.
...
Рейтинг: 0 / 0
29.06.2021, 14:58
    #40080719
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
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
29.06.2021, 15:07
    #40080724
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
uaggster
Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом.
Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить.
:-)))




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

Двойку на четверку поменять - не судьба?
...
Рейтинг: 0 / 0
29.06.2021, 17:00
    #40080756
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Кесарь
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
02.07.2021, 11:38
    #40081333
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Вопрос был о вторниках.

Я привел способ нахождения вторников, который в математике называется решетом, и известный нам еще со школы. Авторство этого способа приписывают древнегреческому математику Эратосфену. Этот способ им был использован для нахождения простых чисел. 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
02.07.2021, 12:39
    #40081363
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Код: 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
02.07.2021, 13:35
    #40081392
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
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
02.07.2021, 13:52
    #40081396
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
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
02.07.2021, 13:54
    #40081397
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился.
...
Рейтинг: 0 / 0
02.07.2021, 16:41
    #40081449
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Wlr-l
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился.
Можно было в FAQ подсмотреть!
Я там тоже писал...
...
Рейтинг: 0 / 0
02.07.2021, 17:12
    #40081453
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Код: 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
02.07.2021, 18:55
    #40081480
spenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Посетитель, интересное решение. Получилось немного усовершенствовать :) 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
02.07.2021, 19:12
    #40081482
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
spenov,

чтобы усовершенствовать, лучше взять номера из готовой таблицы, а не генерить на лету.
а в вашей рекурсии по умолчанию есть ограничение на 100 вторников, которое, впрочем, несложно убрать.
...
Рейтинг: 0 / 0
02.07.2021, 19:16
    #40081483
spenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cгенерить все вторники в заданном диапазоне
Посетитель, рекурсия рассчитает дату 100 раз (ну или сколько требуется), а ваш запрос выполнит столько раз, сколько строк в таблице. а потом отберет те даты, которые попадают в диапазон. вычислений больше. разве не так?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Cгенерить все вторники в заданном диапазоне / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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