SQL Server Date & Datetime Functions

Quick reference for T-SQL date and time functions. Covers all major data types: DATE, TIME, DATETIME, DATETIME2, DATETIMEOFFSET, and SMALLDATETIME.

Date/Time Data Types

TypeRangePrecisionStorage
DATE0001-01-01 – 9999-12-311 day3 bytes
TIME(n)00:00:00 – 23:59:59.9999999100ns3–5 bytes
SMALLDATETIME1900-01-01 – 2079-06-061 minute4 bytes
DATETIME1753-01-01 – 9999-12-313.33ms8 bytes
DATETIME2(n)0001-01-01 – 9999-12-31100ns6–8 bytes
DATETIMEOFFSET(n)Same as DATETIME2 + UTC offset100ns8–10 bytes
Best practice: Use DATETIME2 for new development — it has wider range, higher precision, and is ANSI-compliant. Avoid DATETIME for new tables.

Current Date & Time

FunctionReturnsType
GETDATE()Current local date and timeDATETIME
SYSDATETIME()Current local date and time (higher precision)DATETIME2(7)
GETUTCDATE()Current UTC date and timeDATETIME
SYSUTCDATETIME()Current UTC date and time (higher precision)DATETIME2(7)
SYSDATETIMEOFFSET()Current date/time with UTC offsetDATETIMEOFFSET(7)
CAST(GETDATE() AS DATE)Today's date onlyDATE
CAST(GETDATE() AS TIME)Current time onlyTIME

Extracting Date Parts

FunctionDescriptionExampleResult
YEAR(date)Year as integerYEAR('2024-03-15')2024
MONTH(date)Month (1–12)MONTH('2024-03-15')3
DAY(date)Day of month (1–31)DAY('2024-03-15')15
DATEPART(part, date)Any date part as integerDATEPART(quarter, '2024-03-15')1
DATENAME(part, date)Date part as stringDATENAME(month, '2024-03-15')'March'
DATEPART(weekday, date)Day of week (1=Sun by default)DATEPART(weekday, '2024-03-15')6 (Friday)
DATEPART(week, date)Week of year (1–53)DATEPART(week, '2024-03-15')11
DATEPART(hour, dt)Hour (0–23)DATEPART(hour, '2024-03-15 14:30:00')14

Common DATEPART values: year, quarter, month, dayofyear, day, week, weekday, hour, minute, second, millisecond, microsecond, nanosecond, tzoffset, iso_week.

Date Arithmetic

FunctionDescriptionExampleResult
DATEADD(part, n, date)Add n units to dateDATEADD(month, 3, '2024-01-15')2024-04-15
DATEADD(day, -7, date)Subtract 7 daysDATEADD(day, -7, '2024-03-15')2024-03-08
DATEDIFF(part, start, end)Difference in specified unitsDATEDIFF(day, '2024-01-01', '2024-03-15')74
DATEDIFF_BIG(part, start, end)Like DATEDIFF but returns BIGINTDATEDIFF_BIG(second, '2000-01-01', GETDATE())large number
EOMONTH(date)Last day of the monthEOMONTH('2024-02-10')2024-02-29
EOMONTH(date, n)Last day of month + n monthsEOMONTH('2024-01-01', 1)2024-02-29
DATEDIFF counts boundary crossings, not exact elapsed time. DATEDIFF(year,'2024-12-31','2025-01-01') returns 1 even though only 1 day apart.

Formatting & Conversion

FunctionDescriptionExampleResult
FORMAT(date, fmt)Format using .NET format stringsFORMAT(GETDATE(), 'yyyy-MM-dd')'2024-03-15'
FORMAT(date, 'D', 'de-DE')Locale-aware long dateGerman locale'Freitag, 15. März 2024'
CONVERT(VARCHAR, date, style)Format with style codeCONVERT(VARCHAR, GETDATE(), 103)'15/03/2024' (British)
CONVERT(VARCHAR, date, 120)ISO 8601 datetime'2024-03-15 14:30:00'
CONVERT(VARCHAR, date, 23)ISO date only'2024-03-15'

Common CONVERT style codes: 101=US (mm/dd/yyyy), 103=British (dd/mm/yyyy), 104=German (dd.mm.yyyy), 120=ISO datetime, 23=ISO date. FORMAT is more flexible but slower — avoid in large queries.

Parsing Strings to Dates

FunctionDescriptionExampleResult
CAST('2024-03-15' AS DATE)Parse ISO string2024-03-15
CONVERT(DATE, '15/03/2024', 103)Parse with style codeBritish format2024-03-15
TRY_CAST(str AS DATE)Returns NULL on failureTRY_CAST('notadate' AS DATE)NULL
TRY_CONVERT(DATE, str, style)Safe convert with styleNULL if fails
PARSE(str AS DATE USING culture)Culture-aware parsePARSE('15 März 2024' AS DATE USING 'de-DE')2024-03-15

Constructing Dates

FunctionDescriptionExampleResult
DATEFROMPARTS(y, m, d)Build DATE from partsDATEFROMPARTS(2024, 3, 15)2024-03-15
DATETIME2FROMPARTS(y,mo,d,h,mi,s,frac,prec)Build DATETIME2 from parts
TIMEFROMPARTS(h, m, s, frac, prec)Build TIME from partsTIMEFROMPARTS(14, 30, 0, 0, 0)14:30:00
SMALLDATETIMEFROMPARTS(y,mo,d,h,mi)Build SMALLDATETIME from parts

Common Patterns

-- Start of current month
SELECT DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)

-- End of current month
SELECT EOMONTH(GETDATE())

-- Start of current year
SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1)

-- Truncate to hour (remove minutes/seconds)
SELECT DATEADD(hour, DATEDIFF(hour, 0, GETDATE()), 0)

-- Age in years
SELECT DATEDIFF(year, birthdate, GETDATE())
     - CASE WHEN DATEADD(year, DATEDIFF(year, birthdate, GETDATE()), birthdate) > GETDATE()
            THEN 1 ELSE 0 END

-- Business days between two dates (approximate, no holidays)
SELECT DATEDIFF(day, start_date, end_date)
     - DATEDIFF(week, start_date, end_date) * 2
     - CASE WHEN DATEPART(weekday, start_date) = 1 THEN 1 ELSE 0 END
     + CASE WHEN DATEPART(weekday, end_date) = 1 THEN 1 ELSE 0 END

-- ISO week number
SELECT DATEPART(iso_week, GETDATE())

-- Filter current week's records
WHERE date_col >= DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)
  AND date_col <  DATEADD(week, DATEDIFF(week, 0, GETDATE()) + 1, 0)

-- Safe date range filter (avoid implicit conversions)
WHERE date_col >= CAST('2024-01-01' AS DATE)
  AND date_col <  CAST('2024-04-01' AS DATE)