PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

SQL -- menghitung tanggal akhir dari tanggal mulai tertentu dengan jeda sewenang-wenang

Daripada hanya melihat panjang semester atau jarak antar semester, Anda dapat membuat daftar semua tanggal dalam satu semester menggunakan generate_series() , seperti ini:

SELECT
  row_number() OVER () as day_number,
  day
FROM
(
  SELECT
    generate_series(start_date, end_date, '1 day') as day
  FROM
    semesters
) as day_series
ORDER BY 
  day

(demo SQLFiddle )

Ini menetapkan setiap hari selama satu semester sebuah "nomor hari" yang sewenang-wenang tetapi berurutan, melewatkan semua jarak antar semester.

Anda kemudian dapat menggunakan ini sebagai sub-kueri/CTE JOIN ed ke tabel siswa Anda:pertama-tama temukan "nomor hari" dari tanggal mulai mereka, lalu tambahkan 7 * n_weeks untuk menemukan "nomor hari" dari tanggal akhir mereka, dan akhirnya bergabung kembali untuk menemukan tanggal sebenarnya untuk "nomor hari" tersebut.

Ini mengasumsikan bahwa tidak ada penanganan khusus yang diperlukan untuk sebagian minggu - yaitu jika n_weeks adalah 4, mahasiswa harus terdaftar selama 28 hari yang dalam jangka waktu satu semester. Pendekatan ini dapat disesuaikan untuk mengukur minggu (lulus 1 week sebagai argumen terakhir untuk generate_series() ), dengan langkah tambahan untuk menemukan start_date minggu mana siswa jatuh ke dalam.

Berikut kueri lengkapnya (demo SQLFiddle di sini ):

WITH semester_days AS
(
  SELECT
    semester_id,
    row_number() OVER () as day_number,
    day_date::date
  FROM
  (
    SELECT
      id as semester_id,
      generate_series(start_date, end_date, '1 day') as day_date
    FROM
      semesters
  ) as day_series
  ORDER BY 
    day_date
)
SELECT
  S.id as student_id,
  S.start_date,
  SD_start.semester_id as start_semester_id,
  S.n_weeks,
  SD_end.day_date as end_date,
  SD_end.semester_id as end_semester_id
FROM
  students as S
JOIN
  semester_days as SD_start
  On SD_start.day_date = S.start_date
JOIN
  semester_days as SD_end
  On SD_end.day_number = SD_start.day_number + (7 * S.n_weeks)
ORDER BY
  S.start_date



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara efisien untuk menarik data dari database kedua?

  2. Pembaruan Rekaman Aktif Semua Bidang JSON

  3. PostgreSQL - Kembalikan konten baris saat UPDATE gagal

  4. Postgres COPY TO NULL integer

  5. Apa sebenarnya yang dilakukan pg_escape_string?