Skip to main content

Date & Time Functions

SQL provides extensive functions for extracting, formatting, and calculating date and time values.

GETDATE — Current Date & Time

SELECT
OrderID,
CreationTime,
GETDATE() AS Today
FROM Sales.Orders;

Date Part Extraction

DATETRUNC — Truncate to a Specific Part

SELECT
CreationTime,
DATETRUNC(year, CreationTime) AS Year_Trunc,
DATETRUNC(month, CreationTime) AS Month_Trunc,
DATETRUNC(day, CreationTime) AS Day_Trunc
FROM Sales.Orders;

DATENAME — Get Name of Date Part

Returns a string (e.g., 'January', 'Monday').

SELECT
DATENAME(month, CreationTime) AS MonthName,
DATENAME(weekday, CreationTime) AS WeekdayName
FROM Sales.Orders;

DATEPART — Get Numeric Date Part

Returns an integer.

SELECT
DATEPART(year, CreationTime) AS Year,
DATEPART(month, CreationTime) AS Month,
DATEPART(quarter, CreationTime) AS Quarter,
DATEPART(week, CreationTime) AS Week
FROM Sales.Orders;

YEAR, MONTH, DAY — Shorthand

SELECT
YEAR(CreationTime) AS Year,
MONTH(CreationTime) AS Month,
DAY(CreationTime) AS Day
FROM Sales.Orders;

EOMONTH — End of Month

SELECT
CreationTime,
EOMONTH(CreationTime) AS EndOfMonth
FROM Sales.Orders;

Aggregation with Date Parts

-- Orders per year
SELECT YEAR(OrderDate) AS OrderYear, COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY YEAR(OrderDate);

-- Orders per month (friendly names)
SELECT DATENAME(month, OrderDate) AS OrderMonth, COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY DATENAME(month, OrderDate);

FORMAT — Custom Date Formatting

SELECT
CreationTime,
FORMAT(CreationTime, 'MM-dd-yyyy') AS USA_Format,
FORMAT(CreationTime, 'dd-MM-yyyy') AS EURO_Format,
FORMAT(CreationTime, 'MMM yy') AS Short_Format
FROM Sales.Orders;

Common Format Specifiers

SpecifierOutputExample
ddDay (2 digits)05
dddDay abbreviationMon
ddddFull day nameMonday
MMMonth (2 digits)01
MMMMonth abbreviationJan
MMMMFull month nameJanuary
yy2-digit year25
yyyy4-digit year2025
hh12-hour02
HH24-hour14
mmMinutes30
ssSeconds45
ttAM/PMPM

CONVERT & CAST — Type Conversion

-- CONVERT with style codes
SELECT
CONVERT(DATE, '2025-08-20') AS StringToDate,
CONVERT(VARCHAR, CreationTime, 32) AS USA_Style,
CONVERT(VARCHAR, CreationTime, 34) AS EURO_Style
FROM Sales.Orders;

-- CAST
SELECT
CAST('123' AS INT) AS StringToInt,
CAST('2025-08-20' AS DATE) AS StringToDate,
CAST(CreationTime AS DATE) AS DatetimeToDate
FROM Sales.Orders;

DATEADD & DATEDIFF — Date Arithmetic

-- Add or subtract from a date
SELECT
OrderDate,
DATEADD(day, -10, OrderDate) AS TenDaysBefore,
DATEADD(month, 3, OrderDate) AS ThreeMonthsLater,
DATEADD(year, 2, OrderDate) AS TwoYearsLater
FROM Sales.Orders;

-- Calculate differences between dates
SELECT
EmployeeID,
BirthDate,
DATEDIFF(year, BirthDate, GETDATE()) AS Age
FROM Sales.Employees;

-- Average shipping duration per month
SELECT
MONTH(OrderDate) AS OrderMonth,
AVG(DATEDIFF(day, OrderDate, ShipDate)) AS AvgShipDays
FROM Sales.Orders
GROUP BY MONTH(OrderDate);

ISDATE — Validate Dates

SELECT
OrderDate,
ISDATE(OrderDate) AS IsValidDate,
CASE
WHEN ISDATE(OrderDate) = 1 THEN CAST(OrderDate AS DATE)
ELSE '9999-01-01'
END AS SafeDate
FROM (
SELECT '2025-08-20' AS OrderDate UNION
SELECT '2025-08'
) AS t;

Time Gap Analysis

Use LAG with DATEDIFF to find days between consecutive orders.

SELECT
OrderID,
OrderDate,
LAG(OrderDate) OVER (ORDER BY OrderDate) AS PreviousOrderDate,
DATEDIFF(day, LAG(OrderDate) OVER (ORDER BY OrderDate), OrderDate) AS DaysBetween
FROM Sales.Orders;