|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2021, 22:43 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Если "на проклятом острове нет календаря", то можно так: 1. Выписываешь все числа от дата1 до дата2, включая эти даты 2. Двигаясь от даты1 к дате2 находишь первый вторник и отмечаешь его кружком. 3. Двигаясь от найденного вторника к дате2 отмечаешь кружком каждую 7-ю дату 4. Выписываешь отмеченные кружком даты ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2021, 23:27 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
newbie876454, достаточно найти разницу между днём недели указанной даты и вторником, прибавить 7 * N для других вторников. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 00:54 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
newbie876454 что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой? Тупо, брутально, в стиле "идите на ...й", неоптимально. ... Чтобы только полюбоваться на охреневшую физиономию того, кто будет делать код-ревью. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
:-)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 08:37 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
uaggster, это случаем не твоя функция получения завтрашней даты? Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 08:52 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
andy st uaggster, это случаем не твоя функция получения завтрашней даты? Код: sql 1. 2. 3.
Опа! ... в копилку... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 08:54 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
uaggster newbie876454 что-то не соображу, как полегче сгенерить запросом все вторники от одной даты до другой? Тупо, брутально, в стиле "идите на ...й", неоптимально. ... Чтобы только полюбоваться на охреневшую физиономию того, кто будет делать код-ревью. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
:-)))) Офигенно! И ведь будет работать! Главное ведь в коде что? Предсказуемость результатов! :) А прибавление по одному дню - это самое надёжное, что может быть! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 12:22 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 12:24 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
a_voronin 1. Выше моё сообщение - это была шутка... 2. Ну вы даёте. Я конечно тоже было дело генерировал последовательность дат, но там был просто типа массив с одним полем и небольшим диапазоном. А вот чтобы ТАК... ооо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 12:59 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
a_voronin круто, но тут еще нету вариантов, когда месяц может начинаться 1 числа в 8 утра или 26 числа предыдущего месяца. а некоторые конторы умудряются в разных подразделениях делать отчётность двумя способами (больше не видел) и в эксельках за большие интервалы времени у них будет сходиться до знаков после запятой. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 13:21 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
a_voronin Наш человек! Кстати, я поступил ровно также. Только круче, просто нагенерировав таблицу примерно аналогичного формата с 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.
, предыдущий день, следующий рабочий день, и тому подобные поля. И таскаю с собой в "служебной" бд, по всем серверам организации. Ну, восстанавливаю из единого источника периодически. Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом. Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить. :-))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 14:58 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
uaggster Дошло до того, что программеры считают, что она в комплекте идет с MSSQLSERVER, а обновляется не иначе, как святым духом. Недавно звонил сисадмин из конторы, куда перебралось парочка наших разрабов, они ему плешь проели, что он MSSQLSERVER им "в усеченном виде поставил, не все служебные базы поставил" и требовали дополнительный пак скачать и установить. :-))) Кстати вполне разумная мысль, подумал об этом же, что мс серверу иметь такую готовую таблицу из коробки и штатные средства её заполнения было бы полезно. Ибо используется много кем, да почти что всеми. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 15:07 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
у меня похожий вопрос, только для четвергов... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 15:09 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
svb2018 у меня похожий вопрос, только для четвергов... Двойку на четверку поменять - не судьба? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 15:59 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Кесарь 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2021, 17:00 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Вопрос был о вторниках. Я привел способ нахождения вторников, который в математике называется решетом, и известный нам еще со школы. Авторство этого способа приписывают древнегреческому математику Эратосфену. Этот способ им был использован для нахождения простых чисел. 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.
Результат: 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.
" Вроде не бездельники и могли бы жить Им бы вторники взять и отменить …" Да, вторники здесь ни при чем, скорее Эратосфен с его решетом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 11:38 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 12:39 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
andy st uaggster, это случаем не твоя функция получения завтрашней даты? Код: sql 1. 2. 3.
первая строка Код: sql 1.
иначе функция "завтрашней даты" неправильна ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:35 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
komrad andy st uaggster, это случаем не твоя функция получения завтрашней даты? Код: sql 1. 2. 3.
первая строка Код: sql 1.
иначе функция "завтрашней даты" неправильна нинада "ля-ля" результирующая дата в любом случае будет "завтрашняя" про время в постановке задачи не было ничего ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:52 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:54 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Wlr-l Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился. Я там тоже писал... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 16:41 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 17:12 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Посетитель, интересное решение. Получилось немного усовершенствовать :) set statistics time on говорит что так быстрее работает. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 18:55 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
spenov, чтобы усовершенствовать, лучше взять номера из готовой таблицы, а не генерить на лету. а в вашей рекурсии по умолчанию есть ограничение на 100 вторников, которое, впрочем, несложно убрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 19:12 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Посетитель, рекурсия рассчитает дату 100 раз (ну или сколько требуется), а ваш запрос выполнит столько раз, сколько строк в таблице. а потом отберет те даты, которые попадают в диапазон. вычислений больше. разве не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 19:16 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
spenov, максимальный нужный номер легко вычисляется при известном диапазоне дат. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 19:28 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
iap Wlr-l Я уже начал волноваться, почему iap до сих пор не привел решение с формулой дня недели, не зависящей от настроек сервера? Спасибо, я успокоился. Я там тоже писал... Спасибо, в следующий раз обязательно загляну! Правда, я сказал, что вторники здесь ни_при_чём. Хотел показать, что основой для решения таких задач является известный со школы алгоритм: решето Эратосфена. Причем все основные вычисления в этом решении проводятся с числами и только на последнем этапе формируются даты. Причем, в отличии от чистого решета Эратосфена, генерируется столько строк, сколько нужно сгенерировать дат. Посетитель тоже проникся духом Эратосфена и даже автоматизировал получение базового вторника. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2021, 16:19 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Wlr-l, решето Эратосфена, это взять весь календарь, удалить оттуда понедельники, потом среды и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2021, 17:12 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Посетитель Wlr-l, решето Эратосфена, это взять весь календарь, удалить оттуда понедельники, потом среды и т.д. Зачем так много действий? Берете известный вторник и после него обводите кружком каждую седьмую дату, в оригинале выдавливаете их (отсюда и появилось решето). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2021, 17:21 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Wlr-l Зачем так много действий? потому что алгоритм такой. взять полный набор и итерационным путем убирать лишнее. а мое решение к решету никакого отношения не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2021, 17:41 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Посетитель, " потому что алгоритм такой. взять полный набор и итерационным путем убирать лишнее ". Эратосфен решал задачу нахождения простых чисел, и вы правильно заметили, что в этом случае требуются итерации. Если взять одну итерацию, то в ней он отмечал числа, начиная с определенного числа, через соответствующие равные промежутки. Мы решаем другую задачу: находим вторники. Для этого достаточно одной такой итерации. Каждая итерация у Эратосфена начинается с определенного числа. Нахождение вторников также начинается с определенного вторника. Эратосфен отмечал числа путем зачеркивания (выдавливал ненужное), а я предложил отмечать числа кружком (выдавливать нужное) ( 22341307 ). Это несущественное отличие. Вы делаете упор на организацию цикла, а я – на тело цикла. " а мое решение к решету никакого отношения не имеет " Вы можете считать так, это ваше право. Но есть вопрос: "Чем ваше решение отличается от моего ( 22342687 ), которое было дано раньше?". Мое решение: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Ваше решение: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
В том, что я взял готовый базовый вторник, чтобы не загромождать пример, а вы его вычислили. Все остальное тождественно. Так я уже сказал, что вы "автоматизировали получение базового вторника". Там же я привел рекурсивный вариант, который "переоткрыл" ваш собеседник. И, если уж автоматически формировать базовый вторник, то 1) если взять не первый вторник после даты @D1, а последний вторник перед этой датой, то в запросе n можно убрать -1 2) лучше не вычислять часть даты от целого числа (datepart(dw, @W) – что это такое?), а воспользоваться советом iap : Код: sql 1. 2. 3.
На этом у меня все по этой теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 22:30 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Wlr-l, ну если замена итерационного подхода на неитерационный - это несущественные отличия, то вообще любой sql-запрос, содержащий предикат, это решето Эратосфена что уж говорить о замене фильтрации на генерацию. это, видимо, тоже идентичные алгоритмы) Wlr-l "Чем ваше решение отличается от моего ( 22342687 ), которое было дано раньше? принципиально - ничем. ни от вашего, ни от решения iap. И все они одинаково далеки от алгоритма, на который вы пытаетесь их натянуть. Wlr-l datepart(dw, @W) – что это такое? это просто альтернативный способ получить (@@datefirst+datepart(weekday, dateadd(day, -d, @D1))-2)%7=@W без проверки настройки @@datefirst ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 09:01 |
|
Cгенерить все вторники в заданном диапазоне
|
|||
---|---|---|---|
#18+
Посетитель, 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.
7 3 1 1 2 1 Т.е. это не альтернативные способы несмотря на то, что в вашем решении получаем нужный результат. Плюс к этому, новые типы данных для представления дат уже не воспринимают числа в качестве даты. С точки зрения строгой типизации операция взятия части даты от целого числа должна вызывать ошибку синтаксического разбора. Поэтому вместо 1 можно взять любой вторник, например, Код: sql 1.
и это будет понятней. В вашем решении все-таки нужно заранее знать хотя бы одну дату вторника, а в решении iap достаточно знать константу дня недели. Таким образом, эти два решения не альтернативны. Теперь у меня точно всё, чтобы вторники не начали сниться по ночам. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 21:34 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1684533]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 425ms |
0 / 0 |