Το DATEDIFF επιστρέφει τον αριθμό ημερών, μηνών ή άλλων μονάδων ανάμεσα σε δύο ημερομηνίες. Κάθε βάση δεδομένων το κάνει διαφορετικά, και τα παραδείγματα καλύπτουν PostgreSQL, MySQL, SQLite και SQL Server.
Πώς χρησιμοποιείς το DATEDIFF
Το DATEDIFF μετράει τις ημέρες, τους μήνες, τα έτη ή άλλες μονάδες από μια ημερομηνία έναρξης μέχρι μια ημερομηνία λήξης. Αυτή είναι η εκδοχή του SQL Server, αυτή που εννοούν οι περισσότεροι:
DATEDIFF(unit, start_date, end_date)
SELECT DATEDIFF(day, '2026-01-01', '2026-03-15');
-- Output: 73
SELECT DATEDIFF(month, '2026-01-01', '2026-03-15');
-- Output: 2
SELECT DATEDIFF(day, '2026-03-15', '2026-01-01');
-- Output: -73
Η μονάδα μπορεί να είναι year, quarter, month, week, day, hour, minute, second ή μικρότερη. Όταν η ημερομηνία λήξης είναι πριν από την ημερομηνία έναρξης, το αποτέλεσμα είναι αρνητικό.
Με στήλες, παίρνεις μία διαφορά ανά γραμμή:
-- Input: orders
-- order_id | order_date | ship_date
-- ---------+------------+-----------
-- 1001 | 2026-02-02 | 2026-02-04
-- 1002 | 2026-02-03 | 2026-02-10
-- 1003 | 2026-02-27 | 2026-03-02
-- 1004 | 2026-03-05 | NULL
SELECT
order_id,
order_date,
ship_date,
DATEDIFF(day, order_date, ship_date) AS fulfillment_days
FROM orders;
-- Output:
-- order_id | order_date | ship_date | fulfillment_days
-- ---------+------------+------------+-----------------
-- 1001 | 2026-02-02 | 2026-02-04 | 2
-- 1002 | 2026-02-03 | 2026-02-10 | 7
-- 1003 | 2026-02-27 | 2026-03-02 | 3
-- 1004 | 2026-03-05 | NULL | NULL
Κανόνες που πρέπει να ξέρεις
-
Μετράει όρια, όχι ολόκληρες μονάδες. Το
DATEDIFF(month, ...)μετράει τα όρια μηνών ανάμεσα στις δύο ημερομηνίες, οπότε μία μόνο μέρα μπορεί να μετρήσει ως μήνας ή και ως έτος:
SELECT DATEDIFF(month, '2026-01-31', '2026-02-01');
-- Output: 1
SELECT DATEDIFF(year, '2025-12-31', '2026-01-01');
-- Output: 1
-
NULL μέσα, NULL έξω. Αν οποιαδήποτε από τις δύο ημερομηνίες είναι NULL, το ίδιο είναι και το αποτέλεσμα, όπως στην παραγγελία 1004 παραπάνω. Τύλιξε την κλήση σε
COALESCE()όταν χρειάζεσαι προεπιλεγμένη τιμή.
Εναλλακτική σύνταξη
Η MySQL έχει ένα DATEDIFF με δύο ορίσματα που μετράει μόνο ημέρες και δέχεται πρώτα την ημερομηνία λήξης. Για οποιαδήποτε άλλη μονάδα, χρησιμοποίησε το TIMESTAMPDIFF, που δέχεται πρώτα την ημερομηνία έναρξης και μετράει ολόκληρες μονάδες:
SELECT DATEDIFF('2026-03-15', '2026-01-01');
-- Output: 73
SELECT TIMESTAMPDIFF(MONTH, '2026-01-01', '2026-03-15');
-- Output: 2
Η PostgreSQL δεν έχει DATEDIFF. Αφαίρεσε μια ημερομηνία από μια άλλη για να πάρεις τις ημέρες. Για μεγαλύτερες μονάδες, το AGE() (πρώτα η μεταγενέστερη ημερομηνία) επιστρέφει ένα interval σε έτη, μήνες και ημέρες, και το EXTRACT βγάζει από αυτό ολόκληρες μονάδες:
SELECT DATE '2026-03-15' - DATE '2026-01-01';
-- Output: 73
SELECT AGE('2026-03-15', '2026-01-01');
-- Output: 2 mons 14 days
SELECT EXTRACT(YEAR FROM AGE('2026-03-15', '2026-01-01')) * 12
+ EXTRACT(MONTH FROM AGE('2026-03-15', '2026-01-01'));
-- Output: 2
Ούτε η SQLite έχει DATEDIFF. Το julianday() μετατρέπει μια ημερομηνία σε αριθμό ημερών, οπότε αν αφαιρέσεις δύο τέτοιες τιμές παίρνεις τη διαφορά. Το CAST(... AS INTEGER) πετάει το δεκαδικό μέρος, και δεν υπάρχει μονάδα μήνα ή έτους, οπότε διαίρεσε με 30 ή 365 για μια προσέγγιση:
SELECT julianday('2026-03-15') - julianday('2026-01-01');
-- Output: 73.0
SELECT CAST((julianday('2026-03-15') - julianday('2026-01-01')) / 30 AS INTEGER);
-- Output: 2
-- The time of day counts: 8 p.m. to 8 a.m. is half a day.
-- Wrap each value in date() to count calendar days instead.
SELECT julianday('2026-03-16 08:00') - julianday('2026-03-15 20:00');
-- Output: 0.5
-- A date it can't read gives NULL, so store dates as YYYY-MM-DD
SELECT julianday('03/15/2026');
-- Output: NULL
Πότε να χρησιμοποιείς το DATEDIFF;
Οι περισσότερες ερωτήσεις για διαφορές ημερομηνιών ανήκουν σε μία από αυτές τις τέσσερις κατηγορίες.
Μέτρησε πόσο διήρκεσε κάτι
Αφαίρεσε μια ημερομηνία έναρξης από μια ημερομηνία λήξης για να πάρεις μια διάρκεια: τις ημέρες που χρειάστηκε για να σταλεί μια παραγγελία, τις εβδομάδες που κράτησε ένα project, τα λεπτά που διήρκεσε μια κλήση υποστήριξης.
Μέτρησε ημέρες καθυστέρησης ή ημέρες που απομένουν
Σύγκρινε μια προθεσμία με τη σημερινή ημερομηνία, ή με μια σταθερή ημερομηνία αναφοράς, για να δεις πόσο έχει καθυστερήσει κάτι ή πόσος χρόνος απομένει. Φίλτραρε με βάση το πρόσημο του αποτελέσματος για να κρατήσεις τη μία πλευρά.
Εξέφρασε μια ηλικία σε μήνες ή έτη
Η ηλικία ενός λογαριασμού, η διάρκεια σχέσης με έναν πελάτη και τα χρόνια υπηρεσίας χρειάζονται μεγαλύτερη μονάδα από τις ημέρες. Χρησιμοποίησε μονάδα μήνα ή έτους όπου τη διαθέτει η βάση δεδομένων σου. Στην SQLite, διαίρεσε τις ημέρες.
Βρες γραμμές μέσα σε ένα διάστημα γύρω από μια ημερομηνία
Πάρε την απόλυτη τιμή της διαφοράς για να βρεις γραμμές που απέχουν έως κάποιες ημέρες από μια ημερομηνία, πριν ή μετά από αυτήν: συμβάντα κοντά σε ένα λανσάρισμα, συνδέσεις γύρω από ένα περιστατικό.
Πραγματικά παραδείγματα του DATEDIFF
Έλεγξε τα αιτήματα υποστήριξης βάσει SLA
Κάθε αίτημα πρέπει να επιλύεται μέσα σε τρεις ημέρες. Μέτρησε τις ημέρες που χρειάστηκε το καθένα και σημείωσε τις παραβιάσεις (SQLite):
-- Input: support_tickets
-- ticket_id | created_at | resolved_at
-- ----------+------------+------------
-- 301 | 2026-03-02 | 2026-03-03
-- 302 | 2026-03-04 | 2026-03-07
-- 303 | 2026-03-05 | 2026-03-10
SELECT
ticket_id,
created_at,
resolved_at,
CAST(julianday(resolved_at) - julianday(created_at) AS INTEGER) AS resolution_days,
CASE
WHEN julianday(resolved_at) - julianday(created_at) <= 3 THEN 'Within SLA'
ELSE 'SLA Breach'
END AS sla_status
FROM support_tickets;
-- Output:
-- ticket_id | created_at | resolved_at | resolution_days | sla_status
-- ----------+------------+-------------+-----------------+-----------
-- 301 | 2026-03-02 | 2026-03-03 | 1 | Within SLA
-- 302 | 2026-03-04 | 2026-03-07 | 3 | Within SLA
-- 303 | 2026-03-05 | 2026-03-10 | 5 | SLA Breach
Εμφάνισε τα ληξιπρόθεσμα τιμολόγια
Εμφάνισε τα τιμολόγια που έχουν περάσει την ημερομηνία λήξης τους, με τα πιο καθυστερημένα πρώτα (MySQL):
-- Input: invoices
-- invoice_id | customer | due_date
-- -----------+---------------+-----------
-- 5001 | Acme Hardware | 2026-08-15
-- 5002 | Lumen Design | 2026-09-30
-- 5003 | Acme Hardware | 2026-10-01
-- 5004 | Cedar Clinic | 2026-10-31
SELECT
invoice_id,
customer,
due_date,
DATEDIFF(CURDATE(), due_date) AS days_overdue
FROM invoices
WHERE due_date < CURDATE()
ORDER BY days_overdue DESC;
-- Output (run on 2026-10-13):
-- invoice_id | customer | due_date | days_overdue
-- -----------+---------------+------------+-------------
-- 5001 | Acme Hardware | 2026-08-15 | 59
-- 5002 | Lumen Design | 2026-09-30 | 13
-- 5003 | Acme Hardware | 2026-10-01 | 12
Ομαδοποίησε πελάτες με βάση το πόσο καιρό είναι μαζί σου
Χώρισε τους πελάτες σε κατηγορίες με βάση τα συμπληρωμένα χρόνια τους μαζί σου (PostgreSQL):
-- Input: customers
-- customer_name | signup_date
-- ------------------+------------
-- Northwind Traders | 2022-11-05
-- Bluebird Bakery | 2025-06-20
-- Fjord Outfitters | 2025-12-20
-- Kestrel Labs | 2026-03-02
SELECT
customer_name,
signup_date,
EXTRACT(YEAR FROM AGE(CURRENT_DATE, signup_date)) AS years_with_us,
CASE
WHEN AGE(CURRENT_DATE, signup_date) < INTERVAL '1 year' THEN 'New'
WHEN AGE(CURRENT_DATE, signup_date) < INTERVAL '2 years' THEN 'Established'
ELSE 'Loyal'
END AS customer_tier
FROM customers;
-- Output (run on 2026-10-13):
-- customer_name | signup_date | years_with_us | customer_tier
-- ------------------+-------------+---------------+--------------
-- Northwind Traders | 2022-11-05 | 3 | Loyal
-- Bluebird Bakery | 2025-06-20 | 1 | Established
-- Fjord Outfitters | 2025-12-20 | 0 | New
-- Kestrel Labs | 2026-03-02 | 0 | New
Βρες συνδρομές που πλησιάζουν την ανανέωση
Εμφάνισε τις συνδρομές που λήγουν τις επόμενες 30 ημέρες, μαζί με τις ημέρες που απομένουν (SQL Server). Το WHERE συγκρίνει το subscription_end με ένα εύρος ημερομηνιών αντί να το τυλίγει σε DATEDIFF, ώστε να μπορεί να χρησιμοποιηθεί ακόμα ένα index στη στήλη.
-- Input: subscriptions
-- customer_name | subscription_end
-- -----------------+-----------------
-- Harbor Dental | 2026-10-09
-- Maple Yoga | 2026-10-20
-- Orbit Analytics | 2026-11-07
-- Pinecrest Realty | 2027-01-15
SELECT
customer_name,
subscription_end,
DATEDIFF(day, GETDATE(), subscription_end) AS days_remaining
FROM subscriptions
WHERE subscription_end BETWEEN CAST(GETDATE() AS date)
AND DATEADD(day, 30, CAST(GETDATE() AS date))
ORDER BY days_remaining;
-- Output (run on 2026-10-13):
-- customer_name | subscription_end | days_remaining
-- ----------------+------------------+---------------
-- Maple Yoga | 2026-10-20 | 7
-- Orbit Analytics | 2026-11-07 | 25
Περισσότερα για το DATEDIFF
Σε αυτό το blog:
-
Οδηγός μορφοποίησης ημερομηνιών στην SQL: μετατροπή ημερομηνιών σε κείμενο με
strftime,TO_CHAR,DATE_FORMATκαιFORMAT - Οδηγός εισαγωγής ημερομηνιών στην SQL: τύποι ημερομηνιών και πώς να εισάγεις τιμές ημερομηνίας
- Πώς να κάνεις αφαίρεση στην SQL: αφαίρεση αριθμών, ημερομηνιών και timestamps
-
Πώς να κάνεις αφαίρεση στην PostgreSQL: αριθμητική ημερομηνιών και timestamps, μαζί με το
age() -
Πράξεις αφαίρεσης στην SQLite: διαφορές ημερομηνιών με
julianday() - Εξαγωγή συνολικών ημερών, ωρών ή λεπτών από ένα interval της PostgreSQL: μετατροπή intervals σε αριθμούς
- Οδηγός για το SQL COALESCE: προεπιλεγμένες τιμές για NULL ημερομηνίες
Επίσημη τεκμηρίωση:
- PostgreSQL: Συναρτήσεις και τελεστές ημερομηνίας/ώρας
- MySQL: DATEDIFF() και TIMESTAMPDIFF()
- SQLite: Συναρτήσεις ημερομηνίας και ώρας
- SQL Server: DATEDIFF
Το Beekeeper Studio είναι ένα δωρεάν & open source GUI για βάσεις δεδομένων
Το καλύτερο εργαλείο για SQL queries & επεξεργασία που έχω χρησιμοποιήσει ποτέ. Μου δίνει ό,τι χρειάζομαι για να διαχειρίζομαι τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit
Το Beekeeper Studio είναι γρήγορο, εύχρηστο και κατανοητό με την πρώτη ματιά. Υποστηρίζει πάρα πολλές βάσεις δεδομένων και δουλεύει άψογα σε Windows, Mac και Linux.
Τι λένε οι χρήστες για το Beekeeper Studio
«Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας με SQL. Είναι γρήγορο, εύχρηστο και κάνει τη δουλειά με βάσεις δεδομένων ξανά ευχάριστη.»
«Έχω δοκιμάσει πολλά GUI για βάσεις δεδομένων, αλλά το Beekeeper πετυχαίνει την τέλεια ισορροπία ανάμεσα σε δυνατότητες και απλότητα. Απλά δουλεύει.»