15/17.10. Funkcije za rad sa datumima (koristimo MS SQL Server)
Datumi se pojavljuju u gotovo svakoj bazi — evidencija zaposlenih, rođendani, datumi narudžbina, računi, prijave korisnika i sl.
U SQL Server-u postoje specijalni tipovi podataka za čuvanje datuma i vremena:
| Tip | Opis |
|---|---|
DATE |
Samo datum (npr. 2025-10-08) |
TIME |
Samo vreme (npr. 14:35:20) |
DATETIME |
Datum i vreme zajedno |
SMALLDATETIME |
Datum i vreme sa manjom preciznošću |
U primerima radimo sa tabelom:
CREATE TABLE Zaposleni (
ID int,
Ime nvarchar(30),
DatumRodjenja date,
DatumZaposlenja datetime
);
1️⃣ Dobijanje trenutnog datuma i vremena
| Funkcija | Opis | Primer | Rezultat (primer) |
|---|---|---|---|
GETDATE() |
Vraća trenutni datum i vreme | SELECT GETDATE(); |
2025-10-08 10:42:15.157 |
SYSDATETIME() |
Isto, ali sa većom preciznošću | SELECT SYSDATETIME(); |
2025-10-08 10:42:15.1578946 |
CURRENT_TIMESTAMP |
ANSI standard, isto što i GETDATE() |
SELECT CURRENT_TIMESTAMP; |
2025-10-08 10:42:15.157 |
Napomena: U SQL Serveru 2008 (koji koristimo uz Visual Studio 2010) sve tri funkcije rade, ali SYSDATETIME() nije neophodna ako preciznost nije bitna.
2️⃣ Izdvajanje delova datuma
Za izdvajanje godine, meseca ili dana koristi se funkcija DATEPART().
| Primer | Objašnjenje | Rezultat |
|---|---|---|
SELECT DATEPART(YEAR, GETDATE()); |
Vraća godinu | 2025 |
SELECT DATEPART(MONTH, GETDATE()); |
Vraća mesec | 10 |
SELECT DATEPART(DAY, GETDATE()); |
Vraća dan u mesecu | 8 |
SELECT DATEPART(WEEKDAY, GETDATE()); |
Redni broj dana u nedelji (1–7) | 3 (ako je sreda) |
Alternativno, koristi se i DATENAME() da bi se rezultat vratio kao tekst:
SELECT DATENAME(MONTH, GETDATE()); -- "October"
SELECT DATENAME(WEEKDAY, GETDATE()); -- "Wednesday"
3️⃣ Računanje sa datumima
Dodavanje datuma
SQL Server omogućava dodavanje ili oduzimanje dana, meseci, godina i drugih vremenskih jedinica pomoću funkcije DATEADD().
| Primer | Objašnjenje | Rezultat |
|---|---|---|
SELECT DATEADD(DAY, 5, GETDATE()); |
Dodaje 5 dana | 2025-10-13 |
SELECT DATEADD(MONTH, -2, GETDATE()); |
Oduzima 2 meseca | 2025-08-08 |
SELECT DATEADD(YEAR, 1, '2024-10-08'); |
Dodaje godinu | 2025-10-08 |
U praksi, ovo se koristi za:
-
izračunavanje roka važenja (npr. 30 dana od danas),
-
provere isteka pretplate,
-
kreiranje vremenskih oznaka u evidencijama.
Razlika između datuma
Razliku između dva datuma (u danima, mesecima, godinama…) izračunavamo pomoću DATEDIFF().
| Primer | Opis | Rezultat |
|---|---|---|
SELECT DATEDIFF(DAY, '2025-01-01', GETDATE()); |
Broj dana od Nove godine do danas | 281 |
SELECT DATEDIFF(YEAR, '2000-05-12', GETDATE()); |
Starost u godinama | 25 |
SELECT DATEDIFF(MONTH, '2025-05-01', '2025-10-08'); |
Razlika u mesecima | 5 |
4️⃣ Formatiranje datuma (pretvaranje u tekst)
U SQL-u se konverzija datuma u tekst (string) radi pomoću funkcija za konverziju tipova, najčešće:
-
CONVERT() -
CAST() -
ili u novijim verzijama,
FORMAT()(od SQL Server 2012 naviše).
Pošto koristimo MS SQL Server 2008, funkcija FORMAT() nije dostupna, tako da ćemo da koristimo CONVERT() ili CAST().
🔹 1. CAST() – jednostavan način
SELECT CAST(GETDATE() AS NVARCHAR(20)) AS DatumTekst;
Rezultat (primer):
DatumTekst
-------------------
Oct 15 2025 10:30AM
Napomena: Ovaj format zavisi od podrazumevane lokalne postavke servera (npr. engleski format meseca).
🔹 2. CONVERT() – precizna kontrola formata
Funkcija CONVERT() ima oblik:
CONVERT( ciljni_tip, izraz, stil )
Gde je stil broj koji određuje format datuma.
Primer:
SELECT CONVERT(VARCHAR(10), GETDATE(), 104) AS DatumTekst;
Rezultat:
DatumTekst
----------
15.10.2025
🔹 Najčešći stilovi za CONVERT() (MS SQL Server):
| Stil | Format | Primer rezultata |
|---|---|---|
| 101 | mm/dd/yyyy |
10/15/2025 |
| 102 | yyyy.mm.dd |
2025.10.15 |
| 103 | dd/mm/yyyy |
15/10/2025 |
| 104 | dd.mm.yyyy |
15.10.2025 |
| 105 | dd-mm-yyyy |
15-10-2025 |
| 108 | hh:mm:ss |
10:30:45 |
| 120 | yyyy-mm-dd hh:mi:ss |
2025-10-15 10:30:45 |
| 112 | yyyymmdd |
20251015 |
Kombinovanje datuma i vremena:
SELECT CONVERT(VARCHAR(19), GETDATE(), 120) AS DatumVreme;
Rezultat:
DatumVreme
-------------------
2025-10-15 10:30:45
Primeri
Kreirati datu tabelu i uneti nekoliko datuma, pa izvršiti upite koji koriste različite funkcije:
CREATE TABLE Projekti (
ID int,
Naziv nvarchar(30),
DatumPocetka date,
Rok date
);
INSERT INTO Projekti VALUES
(1, 'Web sajt', '2025-09-15', '2025-10-15'),
(2, 'Mobilna aplikacija', '2025-06-01', '2025-09-30'),
(3, 'SQL kurs', '2025-10-01', '2025-12-01');
Upiti:
-- Trenutni datum
SELECT GETDATE() AS Danas;
-- Projekti koji još traju
SELECT Naziv
FROM Projekti
WHERE Rok > GETDATE();
-- Broj dana do roka
SELECT Naziv, DATEDIFF(DAY, GETDATE(), Rok) AS DanaDoRoka
FROM Projekti;
-- Novi rok: produženje za 10 dana
SELECT Naziv, DATEADD(DAY, 10, Rok) AS NoviRok
FROM Projekti;
Zadaci za vežbu 1:
-
Pronaći godinu početka svakog projekta.
-
Pronaći koliko dana je prošlo od početka do roka svakog projekta.
-
Dodati 7 dana na rok projekta „SQL kurs“.
-
Prikazati mesec početka svakog projekta kao tekst (npr. „October“).
Zadaci za vežbu 2 (diferencirani)
| Nivo | Zadatak |
|---|---|
| 🟢 Za slabije učenike | Napisati upit koji prikazuje trenutni datum i vreme (GETDATE()), i razliku u danima između dva poznata datuma. |
| 🟡 Za srednje učenike | Prikazati naziv projekta i broj dana do isteka roka, koristeći DATEDIFF(). |
| 🔵 Za napredne učenike | Izračunati prosečno trajanje projekata (razlika Rok -
DatumPocetka), i prikazati datum kada će prosečno trajanje biti završeno ako počne danas. |
Zadaci za vežbu 3: Pretvaranje datuma u tekst (sa rešenjima)
U svim primerima koristi se sistemska funkcija
GETDATE()– ona vraća trenutni datum i vreme.
Zadatak 1
Prikazati trenutni datum kao tekst u formatu dd.mm.yyyy.
SQL upit:
SELECT CONVERT(VARCHAR(10), GETDATE(), 104) AS DatumTekst;
Rezultat:
15.10.2025
Zadatak 2
Prikazati trenutni datum kao tekst u ISO formatu yyyy-mm-dd.
SQL upit:
SELECT CONVERT(VARCHAR(10), GETDATE(), 120) AS DatumTekst;
Rezultat:
2025-10-15
Zadatak 3
Prikazati samo vreme (sate, minute i sekunde).
SQL upit:
SELECT CONVERT(VARCHAR(8), GETDATE(), 108) AS VremeTekst;
Rezultat:
10:34:57
Zadatak 4
Prikazati datum i vreme zajedno u formatu: dd-mm-yyyy
hh:mi:ss.
Hint: koristiti stil
105za datum i108za vreme, pa ih spoji operatorom+.
SQL upit:
SELECT
CONVERT(VARCHAR(10), GETDATE(), 105) + ' ' +
CONVERT(VARCHAR(8), GETDATE(), 108) AS DatumVremeTekst;
Rezultat:
15-10-2025 10:34:57
Zadatak 5
Pretvoriti određeni datum (2025-01-01) u tekst i prikazati ga u formatu 01/01/2025.
SQL upit:
SELECT CONVERT(VARCHAR(10), '2025-01-01', 101) AS DatumTekst;
Rezultat:
01/01/2025
🌐 Linkovi za dalji rad i bolje razumevanje
-
📒 W3Schools: SQL Working With Dates
🔗 W3Schools: SQL Server Date Functions -
📘 Microsoft Docs — CAST i CONVERT (Transact-SQL):
🔗 https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql -
📗 Microsoft Docs — Date and Time Styles u CONVERT funkciji:
🔗 https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql#date-and-time-styles -
📙 W3Schools SQL CAST() i CONVERT() Tutorial:
🔗 https://www.w3schools.com/sql/func_sqlserver_cast.asp
🔗 https://www.w3schools.com/sql/func_sqlserver_convert.asp
..