Найти Π² Π”Π·Π΅Π½Π΅
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

πŸ“… Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQL

Часто Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ΅Π½ список всСх Π΄Π°Ρ‚ Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄. НапримСр, для ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ просто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, сколько Π±Ρ‹Π»ΠΎ Π΄Π½Π΅ΠΉ Π±Π΅Π· ΠΏΡ€ΠΎΠ΄Π°ΠΆ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠΎΡ€ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ΅Π³Π°Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ со всСми Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ (дСнь Π½Π΅Π΄Π΅Π»ΠΈ, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ²Π°Ρ€Ρ‚Π°Π»Π°, ΠΏΡ€Π°Π·Π΄Π½ΠΈΠΊΠΈ ΠΈ Ρ‚. Π΄.), Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Π° простая рСализация β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ список Π΄Π°Ρ‚ Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мСсяц. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ постС я ΠΏΠΎΠΊΠ°ΠΆΡƒ, ΠΊΠ°ΠΊ Π½Π° Π»Π΅Ρ‚Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ со всСми Π΄Π°Ρ‚Π°ΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ рассмотрим это для Ρ€Π°Π·Π½Ρ‹Ρ… популярных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…: MySQL, PostgreSQL, MS SQL Server ΠΈ Oracle. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΊΠ°ΠΉΡ„ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ придСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρ‹ – скрипт сам подстроится ΠΏΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мСсяц. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Ρ‹Ρ€Π½ΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ΄, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π±Ρ‹ΡΡ‚Ρ€Π΅Π½ΡŒΠΊΠΎ разбСрСмся, Π·Π°Ρ‡Π΅ΠΌ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ: Ну Ρ‡Ρ‚ΠΎ, ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π‘Π£Π‘Π”! Π’ MySQL начиная с вСрсии 8.0 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (CTE) Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с рСкурсивным CTE: Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚: Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ SQL online Π£ PostgreSQL Π΅ΡΡ‚ΡŒ просто супСр
ОглавлСниС

Часто Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ΅Π½ список всСх Π΄Π°Ρ‚ Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄. НапримСр, для ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ просто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, сколько Π±Ρ‹Π»ΠΎ Π΄Π½Π΅ΠΉ Π±Π΅Π· ΠΏΡ€ΠΎΠ΄Π°ΠΆ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠΎΡ€ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ΅Π³Π°Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ со всСми Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ (дСнь Π½Π΅Π΄Π΅Π»ΠΈ, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ²Π°Ρ€Ρ‚Π°Π»Π°, ΠΏΡ€Π°Π·Π΄Π½ΠΈΠΊΠΈ ΠΈ Ρ‚. Π΄.), Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Π° простая рСализация β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ список Π΄Π°Ρ‚ Π·Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мСсяц.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ постС я ΠΏΠΎΠΊΠ°ΠΆΡƒ, ΠΊΠ°ΠΊ Π½Π° Π»Π΅Ρ‚Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ со всСми Π΄Π°Ρ‚Π°ΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ рассмотрим это для Ρ€Π°Π·Π½Ρ‹Ρ… популярных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…: MySQL, PostgreSQL, MS SQL Server ΠΈ Oracle. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΊΠ°ΠΉΡ„ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ придСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρ‹ – скрипт сам подстроится ΠΏΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ мСсяц.

Π—Π°Ρ‡Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠ°Ρ€ΠΈΡ‚ΡŒΡΡ с ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ?

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Ρ‹Ρ€Π½ΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ΄, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π±Ρ‹ΡΡ‚Ρ€Π΅Π½ΡŒΠΊΠΎ разбСрСмся, Π·Π°Ρ‡Π΅ΠΌ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ:

  1. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹: Если Ρƒ вас Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ днях, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходило (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ), такая Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ "пустыС" Π΄Π½ΠΈ Π±Π΅Π· активности (Π΄Π½ΠΈ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ°ΠΌΠΈ).
  2. Анализ Ρ‚Ρ€Π΅Π½Π΄ΠΎΠ²: ΠšΡ€ΡƒΡ‚ΠΎ для любого Π°Π½Π°Π»ΠΈΠ·Π°, Π³Π΄Π΅ Π½ΡƒΠΆΠ½Π° нСпрСрывная врСмСнная шкала, Π΄Π°ΠΆΠ΅ Ссли Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ.
  3. Π£ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ JOIN'Ρ‹: МоТно просто ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ свои Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π³ΠΊΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ частям Π΄Π°Ρ‚Ρ‹ ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡΠΏΠ»ΠΎΡˆΠ½Ρ‹ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ.
  4. ΠžΡ‚Ρ‡Π΅Ρ‚Ρ‹: Π”Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π΄Π°Ρ‚ для ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ Π΄Π°Ρ‚Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚.

Ну Ρ‡Ρ‚ΠΎ, ΠΏΠΎΠ΅Ρ…Π°Π»ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π‘Π£Π‘Π”!

MySQL

Π’ MySQL начиная с вСрсии 8.0 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (CTE) Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с рСкурсивным CTE:

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  • WITH RECURSIVE dates AS (...): Π—Π°Π΄Π°Π΅ΠΌ рСкурсивноС CTE ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ dates.
  • "Π―ΠΊΠΎΡ€ΡŒ" (Π½Π°Ρ‡Π°Π»ΠΎ): SELECT DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE()) – 1 DAY): Π’ΡƒΡ‚ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. CURDATE() Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, DAYOFMONTH(CURDATE()) – Π½ΠΎΠΌΠ΅Ρ€ дня Π² мСсяцС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 15 для 15 июля), ΠΈ ΠΌΡ‹ просто Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ (дСнь – 1) Π΄Π½Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π½Π° 1-Π΅ число.
  • "РСкурсия" (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅): SELECT DATE_ADD(dt, INTERVAL 1 DAY) FROM dates WHERE dt < LAST_DAY(CURDATE()): Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ добавляСт ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ дню ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π΄Π°Ρ‚Π΅ (dt), ΠΏΠΎΠΊΠ° Π½Π΅ достигнСм послСднСго дня Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ LAST_DAY(CURDATE()).

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ SQL online

PostgreSQL

Π£ PostgreSQL Π΅ΡΡ‚ΡŒ просто супСрудобная функция generate_series(), которая идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нашСй Π·Π°Π΄Π°Ρ‡ΠΈ.

PostgreSQL пСсочница

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  • GENERATE_SERIES(start, stop, step): Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
  • DATE_TRUNC('month', CURRENT_DATE): "ΠžΠ±Ρ€Π΅Π·Π°Π΅Ρ‚" Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° мСсяца, давая Π½Π°ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь.
  • (DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month' – INTERVAL '1 day')::date: ВычисляСм послСдний дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. Для этого ΠΌΡ‹ ΠΈΠ΄Π΅ΠΌ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ мСсяца (+ INTERVAL '1 month'), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ дСнь (- INTERVAL '1 day'), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ послСдний дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца.
  • '1 day': Π“ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг Π² сСрии Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ ΠΎΠ΄Π½ΠΎΠΌΡƒ дню.
  • ::date: ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ Π±Ρ‹Π» Ρ‡ΠΈΡ‰Π΅.

🐘 Руководство ΠΏΠΎ SQL для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 1: созданиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ установка связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ

Пошаговая инструкция ΠΏΠΎ установкС, настройкС ΠΈ наполнСнию Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pgAdmin ΠΈ SQL-запросов.

MS SQL Server 2022

SQL Server ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько способов Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Начиная с SQL Server 2022, функция GENERATE_SERIES позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΎΡ‡Π΅Π½ΡŒ прямолинСйно, ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° PostgreSQL, Π½ΠΎ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с числами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π² Π΄Π°Ρ‚Ρ‹. Для старых вСрсий ΠΈΠ»ΠΈ Ссли Π²Π°ΠΌ Ρ‚Π°ΠΊ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, рСкурсивныС CTE Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ SQL

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  • GENERATE_SERIES(start, stop, step): Π­Ρ‚Π° функция создаСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ чисСл ΠΎΡ‚ start Π΄ΠΎ stop с шагом step. Если step Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ Ρ€Π°Π²Π΅Π½ 1.
  • DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0): Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. Π­Ρ‚ΠΎ наша "отправная Ρ‚ΠΎΡ‡ΠΊΠ°".
  • DAY(EOMONTH(GETDATE())) – 1: EOMONTH(GETDATE()) Π΄Π°Π΅Ρ‚ послСдний дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца. DAY() ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ дня (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 31 для 31 июля). Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ 1, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ максимальноС число для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² нашСй сСрии (ΠΎΡ‚ 0 Π΄ΠΎ количСство_Π΄Π½Π΅ΠΉ_Π²_мСсяцС – 1). НапримСр, Ссли Π² мСсяцС 31 дСнь, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ числа ΠΎΡ‚ 0 Π΄ΠΎ 30.
  • DATEADD(day, value, ...): Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ value, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сгСнСрируСт GENERATE_SERIES (это Π±ΡƒΠ΄ΡƒΡ‚ 0, 1, 2, ... Π΄ΠΎ количСство_Π΄Π½Π΅ΠΉ_Π²_мСсяцС – 1), ΠΌΡ‹ добавляСм это количСство Π΄Π½Π΅ΠΉ ΠΊ нашСй "ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅". Π’Π°ΠΊ ΠΌΡ‹ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π΄Π°Ρ‚Ρƒ мСсяца.

Legacy MS SQL Server

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  • WITH Dates AS (...): ОбъявляСм рСкурсивный CTE ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Dates.
  • "Π―ΠΊΠΎΡ€ΡŒ" (Π½Π°Ρ‡Π°Π»ΠΎ): SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AS dt: Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ стандартный ΠΏΡ€ΠΈΠ΅ΠΌ Π² SQL Server, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца.DATEDIFF(month, 0, GETDATE()): Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ количСство "Π³Ρ€Π°Π½ΠΈΡ† мСсяцСв", пСрСсСчСнных ΠΌΠ΅ΠΆΠ΄Ρƒ 0 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ SQL Server ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ 1 января 1900 Π³ΠΎΠ΄Π°) ΠΈ GETDATE().DATEADD(month, ..., 0): ДобавляСт это количСство мСсяцСв ΠΊ 0, ΠΈ вуаля – ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца.
  • DATEDIFF(month, 0, GETDATE()): Π‘Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ количСство "Π³Ρ€Π°Π½ΠΈΡ† мСсяцСв", пСрСсСчСнных ΠΌΠ΅ΠΆΠ΄Ρƒ 0 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ SQL Server ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ 1 января 1900 Π³ΠΎΠ΄Π°) ΠΈ GETDATE().
  • DATEADD(month, ..., 0): ДобавляСт это количСство мСсяцСв ΠΊ 0, ΠΈ вуаля – ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСнь Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ мСсяца.
  • "РСкурсия" (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅): SELECT DATEADD(day, 1, dt) FROM Dates WHERE DATEPART(month, DATEADD(day, 1, dt)) = DATEPART(month, GETDATE()): ДобавляСм ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ дню ΠΊ dt Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° мСсяц ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄Π°Ρ‚Ρ‹ остаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ.
  • OPTION (MAXRECURSION 366): ВаТная ΡˆΡ‚ΡƒΠΊΠ° для рСкурсивных CTE Π² SQL Server. УстанавливаСт максимальноС количСство Ρ€Π°Π·, сколько ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ рСкурсивная Ρ‡Π°ΡΡ‚ΡŒ. 366 β€” это бСзопасноС число, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π΄Π½ΠΈ Π² Π³ΠΎΠ΄Ρƒ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ високосныС).

πŸ’» Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста»

Oracle

Π’ Oracle Π΅ΡΡ‚ΡŒ мощная конструкция CONNECT BY LEVEL, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ…ΠΎΡ‚ΡŒ синтаксис ΠΈ отличаСтся Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, основная идСя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ряда Π΄Π°Ρ‚ остаСтся ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ. А с появлСниСм GENERATE_SERIES Π² SQL Server 2022, соврСмСнныС вСрсии SQL всС большС ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ. ПониманиС этих ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² β€” супСрваТно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Π² SQL. Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для вашСй ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π‘Π£Π‘Π” ΠΈ Π΅Ρ‘ вСрсии.

НадСюсь, Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ! Если Π΅ΡΡ‚ΡŒ вопросы ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΊΠΎΠ»ΡŒΠ½Ρ‹Π΅ способы, ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ…!