Repository navigation
Expand file tree
/
Copy path09_Date_Time_Functions.sql
More file actions
275 lines (245 loc) · 8.79 KB
/
Copy path09_Date_Time_Functions.sql
File metadata and controls
275 lines (245 loc) · 8.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/* ==============================================================================
SQL Date & Time Functions
---------------------------------------------------------------------------------
This script demonstrates various date and time functions in SQL.
It covers functions such as GETDATE, DATETRUNC, DATENAME, DATEPART,
YEAR, MONTH, DAY, EOMONTH, FORMAT, CONVERT, CAST, DATEADD, DATEDIFF,
and ISDATE.
Table of Contents:
1. GETDATE() | DATE VALUES
2. DATE PART EXTRACTIONS
3. DATETRUNC() | DATA AGGREGATION
4. EOMONTH()
5. DATE PARTS | USE CASES
6. FORMAT()
7. CONVERT()
8. CAST()
9. DATEADD() / DATEDIFF()
10. ISDATE()
=================================================================================
*/
-- Run this line first: every query in this script uses SalesDB
USE SalesDB;
/* ==============================================================================
1. GETDATE() | DATE VALUES
============================================================================== */
/* TASK 1:
Display OrderID, CreationTime, a hard-coded date, and the current system date.
*/
SELECT
OrderID,
CreationTime,
'2025-08-20' AS HardCoded,
GETDATE() AS Today
FROM Sales.Orders;
/* ==============================================================================
2. DATE PART EXTRACTIONS
(DATETRUNC, DATENAME, DATEPART, YEAR, MONTH, DAY)
============================================================================== */
/* TASK 2:
Extract various parts of CreationTime using DATETRUNC, DATENAME, DATEPART,
YEAR, MONTH, and DAY.
*/
SELECT
OrderID,
CreationTime,
-- DATETRUNC Examples
DATETRUNC(year, CreationTime) AS Year_dt,
DATETRUNC(day, CreationTime) AS Day_dt,
DATETRUNC(minute, CreationTime) AS Minute_dt,
-- DATENAME Examples
DATENAME(month, CreationTime) AS Month_dn,
DATENAME(weekday, CreationTime) AS Weekday_dn,
DATENAME(day, CreationTime) AS Day_dn,
DATENAME(year, CreationTime) AS Year_dn,
-- DATEPART Examples
DATEPART(year, CreationTime) AS Year_dp,
DATEPART(month, CreationTime) AS Month_dp,
DATEPART(day, CreationTime) AS Day_dp,
DATEPART(hour, CreationTime) AS Hour_dp,
DATEPART(quarter, CreationTime) AS Quarter_dp,
DATEPART(week, CreationTime) AS Week_dp,
YEAR(CreationTime) AS Year,
MONTH(CreationTime) AS Month,
DAY(CreationTime) AS Day
FROM Sales.Orders;
/* ==============================================================================
3. DATETRUNC() | DATA AGGREGATION
============================================================================== */
/* TASK 3:
Aggregate orders by year using DATETRUNC on CreationTime.
*/
SELECT
DATETRUNC(year, CreationTime) AS Creation,
COUNT(*) AS OrderCount
FROM Sales.Orders
GROUP BY DATETRUNC(year, CreationTime);
/* ==============================================================================
4. EOMONTH()
============================================================================== */
/* TASK 4:
Display OrderID, CreationTime, and the end-of-month date for CreationTime.
*/
SELECT
OrderID,
CreationTime,
EOMONTH(CreationTime) AS EndOfMonth
FROM Sales.Orders;
/* ==============================================================================
5. DATE PARTS | USE CASES
============================================================================== */
/* TASK 5:
How many orders were placed each year?
*/
SELECT
YEAR(OrderDate) AS OrderYear,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY YEAR(OrderDate);
/* TASK 6:
How many orders were placed each month?
*/
SELECT
MONTH(OrderDate) AS OrderMonth,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY MONTH(OrderDate);
/* TASK 7:
How many orders were placed each month (using friendly month names)?
*/
SELECT
DATENAME(month, OrderDate) AS OrderMonth,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY DATENAME(month, OrderDate);
/* TASK 8:
Show all orders that were placed during the month of February.
*/
SELECT
*
FROM Sales.Orders
WHERE MONTH(OrderDate) = 2;
/* ==============================================================================
6. FORMAT()
============================================================================== */
/* TASK 9:
Format CreationTime into various string representations.
*/
SELECT
OrderID,
CreationTime,
FORMAT(CreationTime, 'MM-dd-yyyy') AS USA_Format,
FORMAT(CreationTime, 'dd-MM-yyyy') AS EURO_Format,
FORMAT(CreationTime, 'dd') AS dd,
FORMAT(CreationTime, 'ddd') AS ddd,
FORMAT(CreationTime, 'dddd') AS dddd,
FORMAT(CreationTime, 'MM') AS MM,
FORMAT(CreationTime, 'MMM') AS MMM,
FORMAT(CreationTime, 'MMMM') AS MMMM
FROM Sales.Orders;
/* TASK 10:
Display CreationTime using a custom format:
Example: Day Wed Jan Q1 2025 12:34:56 PM
*/
SELECT
OrderID,
CreationTime,
'Day ' + FORMAT(CreationTime, 'ddd MMM') +
' Q' + DATENAME(quarter, CreationTime) + ' ' +
FORMAT(CreationTime, 'yyyy hh:mm:ss tt') AS CustomFormat
FROM Sales.Orders;
/* TASK 11:
How many orders were placed each year, formatted by month and year (e.g., "Jan 25")?
*/
SELECT
FORMAT(CreationTime, 'MMM yy') AS OrderDate,
COUNT(*) AS TotalOrders
FROM Sales.Orders
GROUP BY FORMAT(CreationTime, 'MMM yy');
/* ==============================================================================
7. CONVERT()
============================================================================== */
/* TASK 12:
Demonstrate conversion using CONVERT.
*/
SELECT
CONVERT(INT, '123') AS [String to Int CONVERT],
CONVERT(DATE, '2025-08-20') AS [String to Date CONVERT],
CreationTime,
CONVERT(DATE, CreationTime) AS [Datetime to Date CONVERT],
CONVERT(VARCHAR, CreationTime, 32) AS [USA Std. Style:32],
CONVERT(VARCHAR, CreationTime, 34) AS [EURO Std. Style:34]
FROM Sales.Orders;
/* ==============================================================================
8. CAST()
============================================================================== */
/* TASK 13:
Convert data types using CAST.
*/
SELECT
CAST('123' AS INT) AS [String to Int],
CAST(123 AS VARCHAR) AS [Int to String],
CAST('2025-08-20' AS DATE) AS [String to Date],
CAST('2025-08-20' AS DATETIME2) AS [String to Datetime],
CreationTime,
CAST(CreationTime AS DATE) AS [Datetime to Date]
FROM Sales.Orders;
/* ==============================================================================
9. DATEADD() / DATEDIFF()
============================================================================== */
/* TASK 14:
Perform date arithmetic on OrderDate.
*/
SELECT
OrderID,
OrderDate,
DATEADD(day, -10, OrderDate) AS TenDaysBefore,
DATEADD(month, 3, OrderDate) AS ThreeMonthsLater,
DATEADD(year, 2, OrderDate) AS TwoYearsLater
FROM Sales.Orders;
/* TASK 15:
Calculate the age of employees.
*/
SELECT
EmployeeID,
BirthDate,
DATEDIFF(year, BirthDate, GETDATE()) AS Age
FROM Sales.Employees;
/* TASK 16:
Find the average shipping duration in days for each month.
*/
SELECT
MONTH(OrderDate) AS OrderMonth,
AVG(DATEDIFF(day, OrderDate, ShipDate)) AS AvgShip
FROM Sales.Orders
GROUP BY MONTH(OrderDate);
/* TASK 17:
Time Gap Analysis: Find the number of days between each order and the previous order.
Note: LAG is a window function, explained later in the Window Value Functions section.
*/
SELECT
OrderID,
OrderDate AS CurrentOrderDate,
LAG(OrderDate) OVER (ORDER BY OrderDate) AS PreviousOrderDate,
DATEDIFF(day, LAG(OrderDate) OVER (ORDER BY OrderDate), OrderDate) AS NrOfDays
FROM Sales.Orders;
/* ==============================================================================
10. ISDATE()
============================================================================== */
/* TASK 18:
Validate OrderDate using ISDATE and convert valid dates.
*/
SELECT
OrderDate,
ISDATE(OrderDate) AS IsValidDate,
CASE
WHEN ISDATE(OrderDate) = 1 THEN CAST(OrderDate AS DATE)
ELSE '9999-01-01'
END AS NewOrderDate
FROM (
SELECT '2025-08-20' AS OrderDate UNION
SELECT '2025-08-21' UNION
SELECT '2025-08-23' UNION
SELECT '2025-08'
) AS t
-- WHERE ISDATE(OrderDate) = 0