Persediaan Temu Duga SQL · Pelajaran

Aritmetik Tarikh dan Selang

Menambah atau menolak tempoh serta mengira perbezaan antara tarikh.

Pelajaran 1 daripada 413 langkah

Aritmetik Tarikh dan Selang ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Mengapa Pengiraan Tarikh Muncul dalam Temu Duga

Aritmetik tarikh ialah salah satu kemahiran SQL yang paling praktikal, jadi penemuduga banyak menggunakannya untuk peranan penganalisis dan bahagian belakang. Hampir setiap soalan perniagaan mempunyai komponen masa: 30 hari terakhir, pesanan setiap minggu, hari sejak pendaftaran.

Masalahnya ialah fungsi tarikh merupakan bahagian SQL yang paling kurang piawai. Operasi yang sama mempunyai sintaks berbeza dalam PostgreSQL, MySQL dan SQL Server. Calon yang baik menerangkan konsep dengan jelas terlebih dahulu, kemudian menyesuaikan sintaks dengan dialek tersebut.

  • Menambah atau menolak tempoh
  • Mengira perbezaan antara dua tarikh
  • Bekerja dengan nilai INTERVAL

Jenis INTERVAL

Dalam PostgreSQL dan piawaian SQL, satu tempoh masa ialah nilai kelas pertama yang dipanggil selang masa. Anda menambahkannya pada tarikh atau cap masa dengan operator + dan - biasa.

Inilah cara paling kemas untuk menyatakan "30 hari yang lalu" atau "3 bulan dari sekarang", dan penemuduga menyukainya kerana ungkapan ini mudah difahami seperti ayat bahasa Inggeris.

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

Menambah Tempoh Merentas Dialek

Penemuduga sering bertanya: "bagaimanakah anda menambah 7 hari dalam MySQL berbanding SQL Server?" Mengetahui tiga dialek utama menunjukkan pengalaman sebenar.

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL Server: DATEADD(day, 7, d)

Konsepnya sama; hanya ejaannya yang berubah. Sentiasa nyatakan dialek yang anda gunakan.

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

Perbezaan antara Dua Tarikh

Bahagian lain dalam aritmetik tarikh ialah mengira jarak antara dua tarikh. Hasilnya bergantung pada unit dan dialek.

Dalam PostgreSQL, menolak dua nilai date memberikan bilangan hari dalam bentuk nombor bulat secara langsung. Menolak dua nilai timestamp pula memberikan selang masa.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF dan Perangkapnya

DATEDIFF wujud dalam MySQL dan SQL Server tetapi berkelakuan secara berbeza, suatu perangkap kegemaran dalam temu duga.

  • MySQL: DATEDIFF(end, start) hanya mengembalikan bilangan hari penuh.
  • SQL Server: DATEDIFF(unit, start, end) menerima unit dan mengira lintasan sempadan, bukan unit penuh.

Kelakuan sempadan itu penting: DATEDIFF(year, '2023-12-31', '2024-01-01') dalam SQL Server mengembalikan 1, walaupun hanya satu hari yang berlalu.

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

Mengira Umur dalam Tahun dengan Betul

"Kira umur pelanggan dalam tahun" ialah soalan klasik. Membahagikan beza hari secara naif dengan 365 menghasilkan perbezaan kerana tahun lompat. PostgreSQL mempunyai AGE() yang mengembalikan selang masa kalendar sebenar.

Untuk mendapatkan kiraan tahun dalam bentuk nombor bulat yang kemas, ambil bahagian tahun daripada umur tersebut.

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

Contoh Berpandu: Pesanan dalam 30 Hari Terakhir

Ini ialah penapis temu duga yang hampir universal. Cara yang betul ialah membandingkan lajur tarikh dengan titik pemotongan yang dikira, bukan membungkus lajur itu dalam fungsi.

Membandingkan order_date dengan titik pemotongan malar memastikan sebarang indeks pada order_date kekal boleh digunakan. Kita akan kembali kepada perkara indeks ini kemudian.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

Julat Separuh Terbuka untuk Bulan Kalendar

Apabila diminta mendapatkan "semua pesanan pada Mac 2024", elakkan BETWEEN '2024-03-01' AND '2024-03-31' pada lajur cap masa. Cara itu terlepas baris pada jam 11 malam 31 Mac dan mudah mengalami ralat satu unit.

Corak teguh ialah selang separuh terbuka: >= untuk permulaan dan < untuk permulaan bulan seterusnya. Corak ini berfungsi untuk apa-apa ketepatan lajur.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT dan Bahagian Tarikh

Mengambil satu komponen daripada tarikh ialah perkara biasa dalam kerja pelaporan. Fungsi piawai ialah EXTRACT(part FROM d), yang disokong oleh PostgreSQL dan MySQL.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) untuk hari dalam minggu
  • SQL Server sebaliknya menggunakan DATEPART(weekday, d)

Perhatikan: mengekstrak MONTH sahaja mengumpulkan bulan Mac daripada tahun yang berbeza, yang jarang sekali anda mahukan.

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

Contoh Lanjutan: Hari hingga Hari Lahir Seterusnya

Ini ialah teka-teki pengiraan yang lebih mencabar, yang menggabungkan pengekstrakan dan penambahan. Bina hari lahir tahun ini daripada bulan dan hari kelahiran, dan jika tarikh itu sudah berlalu, pindahkan pengiraan ke tahun hadapan.

Menerangkan langkah-langkah ini secara lisan menunjukkan kepada penemuduga bahawa anda boleh menaakul tentang kes tepi, seperti hari lahir yang sudah berlaku pada tahun ini.

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

Hari Pertama dan Terakhir Bulan

"Berikan hari terakhir bagi bulan setiap pesanan" menguji sama ada anda menggunakan fungsi terbina dalam atau membinanya semula. PostgreSQL menggabungkan DATE_TRUNC dengan pengiraan selang masa; MySQL mempunyai LAST_DAY() secara langsung.

Helah untuk mendapatkan hari terakhir dalam Postgres: pangkaskan kepada permulaan bulan, tambah satu bulan dan tolak satu hari.

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

Semakan Pantas

Uji pemahaman anda tentang kelakuan perbezaan tarikh merentas dialek.

Ringkasan: Aritmetik Tarikh dan Selang Masa

Perkara utama untuk temu duga:

  • Gunakan nilai INTERVAL dengan +/- dalam Postgres; DATE_ADD/DATEDIFF dalam MySQL; DATEADD/DATEDIFF dalam SQL Server.
  • DATEDIFF SQL Server mengira lintasan sempadan, bukan unit yang telah berlalu; inilah perangkap utama.
  • Untuk umur dalam tahun, ambil nilai daripada AGE() dan bukannya membahagikan hari dengan 365.
  • Tapis baris terkini dengan membandingkan lajur dengan titik pemotongan yang dikira, dan gunakan julat separuh terbuka (>= start AND < next) untuk tetingkap bulan.

Nyatakan konsep terlebih dahulu, kemudian sesuaikan dengan dialek.

Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Aritmetik Tarikh dan Selang” percuma?

Ya — teks penuh “Aritmetik Tarikh dan Selang” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Aritmetik Tarikh dan Selang”?

Menambah atau menolak tempoh serta mengira perbezaan antara tarikh. Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Aritmetik Tarikh dan Selang” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?

Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Aritmetik Tarikh dan Selang
  2. Memendekkan dan Mengumpulkan Tarikh
  3. Menghuraikan dan Memformat Rentetan
  4. Zon Waktu dan Cap Masa
← Kembali ke Persediaan Temu Duga SQL