Bài viết này tập trung vào việc phát triển hiểu biết cơ bản về cách sử dụng một trong những hàm ngày Transact-SQL phổ biến nhất:DATEADD, DATEDIFF và DATEPART.
Trong bài viết này, tôi cũng nhấn mạnh tầm quan trọng của việc sử dụng đúng các hàm ngày này trong các thao tác ngày tháng hàng ngày, tiếp theo là một số tình huống thú vị trong đó các hàm ngày này có thể được sử dụng một cách hợp tác để giải quyết các phép tính ngày hơi phức tạp.
Vì các hàm này chủ yếu được sử dụng trong thao tác ngày tháng, trước tiên chúng ta hãy thử hiểu ý của chúng ta khi thao tác ngày tháng.
Thao tác ngày hiểu
Các giá trị ngày-giờ thường cần được sửa đổi theo yêu cầu và phương pháp sửa đổi hoặc xử lý hoặc kiểm soát các phép tính ngày-giờ được gọi là thao tác ngày.
Chúng tôi cũng đề cập đến tình huống này (thao tác ngày tháng) khi một giá trị ngày tháng được đọc từ cơ sở dữ liệu và sau đó được sửa đổi trước khi nó được lưu trữ lại.
Tình huống đặt hàng của khách hàng
Một ví dụ thú vị về thao tác ngày tháng là đơn đặt hàng của khách hàng kịch bản, khi một đơn đặt hàng do khách hàng đặt được xử lý, ngày giao hàng phải được đặt trước 5 ngày so với ngày đặt hàng , do đó, điều này có nghĩa là nhà phát triển phải sử dụng (các) hàm ngày T-SQL để thao tác (sửa đổi) ngày đặt hàng để tính toán ngày giao hàng .
Báo cáo bán hàng hàng ngày mẫu
Một ví dụ hơi phức tạp là khi người dùng doanh nghiệp chạy Báo cáo bán hàng hàng ngày nếu nó hiển thị kết quả của ngày hôm qua.
Ví dụ:nếu chúng tôi chạy Báo cáo bán hàng hàng ngày vào Chủ nhật lúc 11:00, nó sẽ hiển thị cho chúng ta kết quả dựa trên thứ bảy và nếu chúng ta chạy vào thứ bảy lúc 17:00, nó sẽ hiển thị cho chúng ta tất cả kết quả vào thứ sáu, vì ngày hiện tại vẫn chưa kết thúc và là ngày gần đây nhất ngày hoàn thành có sẵn là ngày hôm qua. Đây là cách các báo cáo hàng ngày chuyên nghiệp nhất bao gồm cả báo cáo tài chính được thiết kế để chạy.
Trong ví dụ này, ngày hiện tại được thao tác (sửa đổi) để lấy ngày trước đó, chứa hồ sơ bán hàng cho một ngày hoàn chỉnh.
Triển khai các ví dụ
Hãy ghi nhớ các ví dụ trên vì chúng tôi sẽ triển khai các tình huống này khi chúng tôi hiểu rõ về cách sử dụng một số hàm ngày phổ biến nhất được mô tả trong bài viết này.
Hiểu các hàm ngày
Trước tiên, hãy xem một số hàm ngày cơ bản có thể giúp chúng ta đáp ứng các yêu cầu về thao tác ngày tháng, chẳng hạn như xác định ngày giữa hai ngày (ngày đặt hàng và ngày giao hàng), nhận hồ sơ bán hàng của tuần trước dựa trên ngày hiện tại hoặc tính ngày hết hạn dự kiến dựa trên ngày sản xuất và như vậy.
Vì không có quy tắc cứng và nhanh, trước tiên chúng ta bắt đầu khám phá hàm DATEPART.
Sử dụng hàm DATEPART
Định nghĩa đơn giản
Hàm DATEPART được sử dụng để trả về một phần của ngày đã cho ở dạng giá trị số.
Phần có thể là ngày của ngày, tháng của ngày, năm của ngày, v.v.
Ví dụ:chúng ta có thể sử dụng hàm DATEPART để lấy ngày của một ngày cụ thể để xác định xem đơn hàng đã được đặt vào Chủ nhật hay chưa.
Một ví dụ khác là chuyển tháng của một ngày nhất định cho một hàm ngày khác để xử lý thêm.
Định nghĩa Microsoft
Hàm này trả về một số nguyên đại diện cho ngày tháng được chỉ định của ngày được chỉ định .
Khả năng tương thích
Theo tài liệu của Microsoft, chức năng này tương thích với các phiên bản SQL Server sau:
- SQL Server 2008 plus
- Cơ sở dữ liệu Azure SQL
- Kho dữ liệu Azure SQL
- Kho dữ liệu song song
Cú pháp
DATEPART (datepart, date)
Ví dụ 1:Bắt đầu một phần của năm
Hãy để chúng tôi cũng xác định một ngày nhất định ( Ngày đặt hàng ) để có được phần mong muốn của nó (Ngày, Tháng, Năm) bằng cách sử dụng chức năng DATEPART.
Để có được Năm của ngày đặt hàng, chúng tôi chỉ cần vượt qua YEAR theo sau là Ngày đặt hàng (@OrderDate) trong DATEPART chức năng như sau:
- Xác định ngày đặt hàngDECLARE @OrderDate DATETIME2 ='2017-01-11' - Lấy năm đặt hàng Ngày đặt hàngSELECT DATEPART (YEAR, @ OrderDate) là Year_OrderDate
Ví dụ 2:Lấy Phần tháng
Nếu chúng ta muốn biết tháng của ngày thì Tháng cần được chuyển vào DATEPART chức năng như sau:
- Xác định Ngày đặt hàngDECLARE @OrderDate DATETIME2 ='2017-01-11' - Lấy tháng của ngày đặt hàngSELECT DATEPART (MONTH, @ OrderDate) là Month_OrderDate
Ví dụ 3:Bắt đầu Phần trong Ngày
Để tìm phần Ngày của ngày, chỉ cần vượt qua DAY vào DATEPART chức năng như sau:
- Xác định Ngày đặt hàngDECLARE @OrderDate DATETIME2 ='2017-01-11' - Ngày lấy hàng Ngày đặt hàngSELECT DATEPART (DAY, @ OrderDate) là Day_OrderDate
Ví dụ 4:Xem phần Ngày trong tuần
Để xem phần Ngày trong tuần của ngày, chỉ cần vượt qua WEEKDAY vào DATEPART chức năng như sau:
- Xác định ngày đặt hàngDECLARE @OrderDate DATETIME2 ='2017-01-11' - Lấy ngày trong tuần của ngày đặt hàngSELECT DATEPART (WEEKDAY, @ OrderDate) là WeekDay_OrderDate
Chúng tôi nhận được 4, là Thứ Tư bắt đầu từ Chủ Nhật, là 1.
Tương tự, chúng ta cũng có thể lấy phần Quý, Giờ, Phút, Thứ hai của ngày.
Hãy chuyển sang chức năng ngày tiếp theo.
Sử dụng hàm DATEADD
Định nghĩa đơn giản
Hàm DATEADD được sử dụng để thêm hoặc bớt một ngày.
Ví dụ:chúng tôi có thể tìm hiểu ngày sẽ là sau bốn ngày hoặc bốn ngày trước.
Điều này rất hữu ích trong các tình huống mà ngày dự kiến phải được tính toán dựa trên một ngày nhất định, chẳng hạn như ngày hết hạn thành viên phải là chính xác một năm kể từ ngày đăng ký.
Một ví dụ khác là tính toán ngày kết thúc khóa học phải sau chính xác hai tháng sau ngày bắt đầu khóa học.
Định nghĩa Microsoft
Hàm này thêm một số được chỉ định giá trị (dưới dạng số nguyên có dấu) cho một ngày tháng được chỉ định của một đầu vào ngày giá trị và sau đó trả về giá trị đã sửa đổi đó.
Khả năng tương thích
Theo tài liệu của Microsoft, chức năng này tương thích với các phiên bản SQL Server sau:
- SQL Server 2008 plus
- Cơ sở dữ liệu Azure SQL
- Kho dữ liệu Azure SQL
- Kho dữ liệu song song
Cú pháp
DATEADD (datepart, number, date)
Datepart là bất kỳ phần nào của ngày như ngày, tháng, năm, ngày trong tuần, giờ, v.v.
Sau đó, số là số của phần ngày (ngày, tháng, năm, v.v.) được thêm vào hoặc trừ đi
Ngày là một ngày cụ thể cần được thêm hoặc bớt bằng hàm DATEADD
Ví dụ 1:Bắt đầu ngày sang năm
Hãy để chúng tôi xác định một ngày nhất định (Ngày đăng ký) sẽ được thêm hoặc bớt bằng cách sử dụng DATEADD hoạt động dựa trên các yêu cầu.
Có thể lấy ngày của năm tiếp theo bằng cách thêm 1 vào phần ngày của Năm.
Để có được năm tiếp theo kể từ ngày đăng ký, chúng tôi chỉ cần thêm DatePart Năm theo sau là 1, tiếp theo là Ngày đăng ký (@RegistrationDate) trong DATEADD chức năng như sau:
- Xác định ngày đăng kýDECLARE @RegDate DATETIME2 ='2018-07-10' - Bắt đầu năm sau kể từ ngày đăng kýSELECT DATEADD (YEAR, 1, @ RegDate) là NextYear_RegDate
Ví dụ 2:Lấy Ngày Tháng Sau
Để có Ngày tháng tới, hãy vượt qua MONTH ngày bắt đầu đến DATEADD theo sau là số tháng chúng tôi muốn thêm, sau đó là ngày nhất định là ngày đăng ký (RegDate) trong trường hợp của chúng tôi.
- Xác định ngày đăng kýDECLARE @RegDate DATETIME2 ='2018-07-10'SELECT @RegDate AS RegDate - Hiển thị ngày đăng ký - Bắt đầu THÁNG tiếp theo kể từ ngày đăng kýSELECT DATEADD (MONTH, 1, @ RegDate) là NextMonth_RegDate
Ví dụ 3:Bắt đầu ngày tiếp theo
Nếu khóa học bắt đầu vào ngày đăng ký sau (tiếp theo), chúng tôi cần vượt qua DAY với 1 kể từ ngày hôm sau thêm một ngày khác vào ngày đăng ký, được minh họa như sau:
- Xác định ngày đăng kýDECLARE @RegDate DATETIME2 ='2018-07-10'SELECT @RegDate AS RegDate - Hiển thị ngày đăng ký-- Bắt ngày tiếp theo từ ngày đăng kýSELECT DATEADD (DAY, 1, @ RegDate) là NextDAY_RegDate
Ví dụ 4:Thiết lập Ngày Báo cáo Bán hàng Hàng ngày
Bây giờ chúng ta hãy tập trung vào một kịch bản hơi phức tạp thường được sử dụng trong việc phát triển các báo cáo tài chính hàng ngày.
Nếu chúng tôi muốn tạo báo cáo bán hàng hàng ngày, báo cáo đó phải hiển thị dữ liệu của ngày hôm qua, vì ngày hiện tại chưa hoàn thành và ngày hoàn chỉnh gần đây nhất là ngày hôm qua như đã thảo luận ở đầu bài viết này.
Cuối cùng, chúng tôi cũng cần chuyển đổi Ngày giờ của ngày hôm qua thành giá trị chỉ Ngày để giúp báo cáo bao quát cả ngày dễ dàng hơn.
Để lấy ngày hôm qua dựa trên ngày hôm nay, chúng ta cần thêm “-1 ngày” vào ngày hiện tại như sau:
- Xác định Ngày hiện tạiDECLARE @CurrentDate DATETIME2 =GETDATE () SELECT @CurrentDate AS CurrentDate - Hiển thị ngày đăng ký-- Lấy ngày và giờ hôm qua từ ngày hiện tạiSELECT DATEADD (DAY, -1, @ CurrentDate) thành Ngày hôm quaTime_CurrentDate-- Chuyển đổi Ngày hôm qua Chỉ thành Ngày thángSELECT CAST (DATEADD (DAY, -1, @ CurrentDate) AS DATE) thành Ngày hôm quaOnly_CurrentDate
Sử dụng hàm DATEDIFF
Định nghĩa đơn giản
Hàm DATEDIFF được sử dụng để xác định sự khác biệt về ngày, tháng, năm, giờ, v.v. giữa hai ngày.
Ví dụ:chúng tôi có thể tìm ra bao nhiêu ngày đã trôi qua giữa hai ngày.
Điều này cũng rất hữu ích trong các tình huống mà chúng tôi cần điều tra sự khác biệt giữa ngày giao đơn đặt hàng dự kiến và ngày giao đơn đặt hàng thực tế.
Một ví dụ khác là theo dõi thời gian, có nghĩa là biết đã dành bao nhiêu giờ cho một dự án cụ thể kể từ khi nó bắt đầu cho đến nay.
Định nghĩa Microsoft
Hàm này trả về số lượng (dưới dạng giá trị số nguyên có dấu) của các ranh giới ngày tháng cụ thể được vượt qua giữa ngày bắt đầu được chỉ định và enddate .
Khả năng tương thích
Theo tài liệu của Microsoft, chức năng này tương thích với các phiên bản SQL Server sau:
- SQL Server 2008 plus
- Cơ sở dữ liệu Azure SQL
- Kho dữ liệu Azure SQL
- Kho dữ liệu song song
Cú pháp
DATEDIFF (ngày tháng, ngày bắt đầu, ngày kết thúc)Datepart là bất kỳ phần nào của ngày như ngày, tháng, năm, ngày trong tuần, giờ, v.v.
Ví dụ 1:Hiểu sự khác biệt theo ngày
Hãy để chúng tôi cố gắng hiểu cách DATEDIFF chức năng hoạt động.
Nếu chúng tôi cố gắng tìm ra sự khác biệt trong những ngày từ ngày 1 tháng 7 năm 2018 đến ngày 2 tháng 7 năm 2018, chúng tôi sẽ nhận được 1 ngày, có nghĩa là nó trừ ngày kết thúc từ ngày bắt đầu để nhận được sự khác biệt:
SELECT DATEDIFF (DAY, '01 JULY 2018', '02 JULY 2018') AS Days_Between_Two_Consaries_DatesSELECT DATEDIFF (DAY, '01 JULY 2018 ',' 03 JULY 2018 ') AS Days_Between_01_July_03_July
Ví dụ 2:Số ngày từ khi đặt hàng đến khi giao hàng
Hãy xác định hai ngày khác nhau, Ngày đặt hàng và Ngày giao hàng, sẽ được sử dụng để xác định sự khác biệt về ngày, tháng, năm, giờ, v.v.
Để tìm hiểu số ngày giữa ngày đặt hàng và ngày giao hàng, thời gian DAY được chuyển vào DATEDIFF theo sau là Ngày bắt đầu (Ngày đặt hàng) và Ngày kết thúc (Ngày giao hàng) :
- Xác định ngày đặt hàng và ngày giao đơn hàngDECLARE @OrderDate DATETIME2 ='28 tháng 7 năm 2018'DECLARE @DeliveryDate DATETIME2 ='07 tháng 8 năm 2018'SELECT @OrderDate AS Ngày đặt hàng, @ DeliveryDate as DeliveryDate-- Hiển thị đơn hàng và ngày giao hàng-- Nhận chênh lệch về số ngày giữa ngày đặt hàng và ngày giao hàngSELECT DATEDIFF (DAY, @ OrderDate, @ DeliveryDate) là Days_Between_Order_and_Delivery
Ví dụ 3:Nhận Giờ Dự án (Theo dõi Thời gian)
Đây là một ví dụ thú vị về theo dõi thời gian bằng hàm DATEDIFF.
Ví dụ:chúng tôi muốn biết tổng số ngày và ngày tính theo giờ và ngày tính theo phút chúng tôi đã dành cho một dự án cụ thể và sau đó, trước tiên chúng tôi sẽ chuyển phần ngày DAY vào hàm DATEDIFF, trong đó ngày bắt đầu là ngày bắt đầu dự án và ngày kết thúc là ngày hôm nay, sau đó vượt qua HOUR rồi chuyển MINUTE như sau:
- Xác định ngày bắt đầu dự ánDECLARE @ProjectStartDate DATETIME2 ='10 tháng 11 năm 2018'SELECT @ProjectStartDate AS ProjectStartDate-- Hiển thị ngày bắt đầu dự án - Nhận số ngày dành cho dự án cho đến naySELECT DATEDIFF (DAY, @ ProjectStartDate, GETDATE ( )) as Project_Days_So_Far-- Nhận Số giờ dành cho dự án cho đến naySELECT DATEDIFF (HOUR, @ ProjectStartDate, GETDATE ()) as Project_Hours_So_Far-- Nhận Số phút dành cho dự án cho đến naySELECT DATEDIFF (MINUTE, @ ProjectStartDate, GETDATE ( )) dưới dạng Project_Minutes_So_Far
Xin chúc mừng, bạn đã học cách sử dụng thành công các hàm DATEADD, DATEDIFF và DATEPART T-SQL.
Việc cần làm
Bây giờ bạn đã quen với một số chức năng ngày cơ bản, hãy thử thách bản thân bằng cách thử những thứ được đề cập bên dưới:
- Vui lòng tham khảo bài viết trước của tôi Quy trình báo cáo kiểm tra đơn vị - Chuyển đến Bắt đầu TDDD Phần-4 để thiết lập cơ sở dữ liệu SQLDevBlogReportTDD mẫu, rồi tạo chế độ xem để tìm ra số tháng dựa trên ngày đăng ký của Tác giả.
- Vui lòng tham khảo bài viết trước của tôi Đơn giản hóa quy trình lưu trữ chính của đơn vị kiểm tra cũng gọi là thủ tục tiện ích để tạo cơ sở dữ liệu SQLBookShop mẫu và thêm Ngày giao hàng cột Đặt hàng bảng, sau đó tạo một thủ tục mới được lưu trữ ProcessOrder sử dụng DATEADD chức năng thêm thời gian giao hàng dự kiến sau năm ngày kể từ ngày đặt hàng.
- Vui lòng xem bài viết trước của tôi Bước tới Bắt đầu Phát triển Cơ sở dữ liệu Theo hướng Thử nghiệm (TDDD) - Phần 3 và cố gắng tạo báo cáo hàng ngày bằng cách sử dụng hàm DATEADD T-SQL bằng cách sửa đổi dữ liệu trong cơ sở dữ liệu SQLDevBlogReportTDD mẫu sao cho có đủ dữ liệu để hiển thị trong báo cáo.