Trong hướng dẫn này, bạn đã tìm hiểu về kiểu dữ liệu 0 của MySQL và một số hàm 0 hữu ích Một giá trị ngày, giờ hoặc dấu thời gian có thể được so sánh với một giá trị khác của cùng một loại dữ liệu, một hằng số ngày giờ của cùng một loại dữ liệu hoặc với một biểu diễn chuỗi của một giá trị của loại dữ liệu đó. Ngoài ra, giá trị DẤU THỜI GIAN KHÔNG CÓ Múi giờ có thể được so sánh với giá trị DẤU THỜI GIAN CÓ Múi giờ Tất cả các so sánh đều theo trình tự thời gian, có nghĩa là thời điểm càng xa từ ngày 1 tháng 1 năm 0001 thì giá trị của thời điểm đó càng lớn. Thời gian 24. 00. 00 so sánh lớn hơn thời gian 00. 00. 00 So sánh liên quan đến giá trị THỜI GIAN và biểu diễn chuỗi giá trị thời gian luôn bao gồm giây. Nếu biểu diễn chuỗi bỏ qua giây, thì không có giây nào được ngụ ý Các so sánh liên quan đến giá trị dấu thời gian được đánh giá theo các quy tắc sau
ví dụ 1. Bảng TABLE1 có 2 cột. C1, được định nghĩa là DẤU THỜI GIAN VỚI Múi giờ; . Một hàng được chèn vào bảng với câu lệnh INSERT sau. Các giá trị đầu vào được cung cấp bởi các biểu diễn chuỗi ký tự của dấu thời gian với múi giờ. Giả sử rằng múi giờ ngầm định là -5:00 , câu lệnh SELECT sau đây sẽ không trả về bất kỳ hàng nào. Biểu diễn chuỗi của giá trị DẤU THỜI GIAN KHÔNG CÓ Múi giờ được chuyển thành giá trị DẤU THỜI GIAN CÓ Múi giờ, dẫn đến dấu thời gian có giá trị múi giờ là '2007-11-05-08.00.00-05:00' cho cột C2. Vị từ so sánh là sai vì hai giá trị không bằng nhau.
ví dụ 2. Khi giá trị DẤU THỜI GIAN KHÔNG CÓ Múi giờ được so sánh với một biểu diễn chuỗi của DẤU THỜI GIAN KHÔNG CÓ Múi giờ hoặc giá trị DẤU THỜI GIAN CÓ Múi giờ, thì biểu diễn chuỗi được chuyển thành DẤU THỜI GIAN KHÔNG CÓ Múi giờ (bất kể chuỗi có chứa múi giờ hay không). Việc so sánh được thực hiện bằng cách sử dụng hai giá trị DẤU THỜI GIAN KHÔNG CÓ Múi giờ. Giả sử rằng string_hv chứa dấu thời gian có giá trị múi giờ là Thật khó để sử dụng ngày tháng trong truy vấn máy chủ SQL, đặc biệt nếu bạn không có kiến thức tốt về cách thức hoạt động của loại DateTime trong máy chủ SQL. Ví dụ: một trong những truy vấn SQL thường được hỏi trong cuộc phỏng vấn là "chọn tất cả các hàng có ngày là 20151007?" Truy vấn so sánh ngày trong SQLĐể hiểu cách so sánh ngày tháng trong SQL, hãy xem một ví dụ trong đó trường DateTime cũng có một số giá trị thời gianGiả sử chúng ta có bảng sau với varchar course_name và datetime course_date columns: IF OBJECT_ID( 'tempdb..#Course' ) IS NOT NULL DROP TABLE #Course; CREATE TABLE #Course (course_name varchar(10), course_date datetime); INSERT INTO #Course VALUES ('Java', '2015-10-06 11:16:10.496'); INSERT INTO #Course VALUES ('MySQL', '2015-10-07 00:00:00.000'); INSERT INTO #Course VALUES ('SQL SERVER', '2015-10-07 11:26:10.193' ); INSERT INTO #Course VALUES ('PostgreSQL', '2015-10-07 12:36:10.393'); INSERT INTO #Course VALUES ('Oracle', '2015-10-08 00:00:00.000'); Bây giờ, bạn cần viết một truy vấn để nhận tất cả các khóa học vào ngày '2015-10-07'? ________số 8_______ Hãy xem giải pháp khác hoạt động như thế nào Nếu bạn chỉ so sánh ngày với toán tử = và chỉ cung cấp ngày, bạn sẽ nhận được các hàng có trường thời gian bằng 0 vì máy chủ SQL sẽ sử dụng '00. 00. 00. 000" cho thời gian, như trong ví dụ sau. SELECT * FROM #Course WHERE course_date = '2015-10-07' course_name course_date MySQL 2015-10-07 00:00:00.000 Bạn có thể thấy nó chỉ mang lại một hàng, trong đó thời gian bằng 0, nó không khớp với hai hàng khác khi thời gian khác không. Xem Truy vấn Microsoft SQL Server 2012 để tìm hiểu thêm về cách máy chủ SQL xử lý các định dạng ngày và thông tin ngày và giờ bị thiếu Giải pháp 2 - So sánh ngày với mệnh đề betweenCó vẻ như giữa là tùy chọn phù hợp để so sánh các ngày không tính thời gian. Bạn có thể đặt ngày hiện tại và ngày tiếp theo để bao gồm tất cả các thời điểm có ngày giống nhau, nhưng tiếc là điều đó sẽ không hoạt động. Nó cũng sẽ lấy giá trị ngày tiếp theo như bên dưới.SELECT * FROM #Course WHERE course_date between '2015-10-07' and '2015-10-08' course_name course_date MySQL 2015-10-07 00:00:00.000 SQL SERVER 2015-10-07 11:26:10.193 PostgreSQL 2015-10-07 12:36:10.393 Oracle 2015-10-08 00:00:00.000 Bạn có thể thấy giữa cũng được tìm nạp 2015-10-08 00. 00. 00. 000 giá trị, không mong muốn. Điều này xảy ra vì mệnh đề BETWEEN sẽ luôn kéo bất kỳ giá trị nào của ngày tiếp theo nửa đêm. Xem Truy vấn Microsoft SQL Server 2012 để tìm hiểu thêm về chủ đề này. Cuộc thảo luận cũng hợp lệ cho SQL Server 2014. Luôn sử dụng >= và < để so sánh ngày thángCâu trả lời đúng là sử dụng các toán tử lớn hơn (>) và nhỏ hơn (<). Điều này sẽ làm việc như mong đợi. Để sử dụng tùy chọn này, chỉ cần đặt ngày và ngày tiếp theo vào mệnh đề where như hình bên dướiSELECT * FROM #Course WHERE course_date >= '2015-10-07' and course_date < '2015-10-08' course_name course_date MySQL 2015-10-07 00:00:00.000 SQL SERVER 2015-10-07 11:26:10.193 PostgreSQL 2015-10-07 12:36:10.393 Bạn có thể thấy chúng tôi có chính xác ba 3 hàng như mong đợi. Chỉ cần nhớ sử dụng < ở vị từ thứ hai, điều này sẽ đảm bảo rằng '2015-10-08 00. 00. 00. 000' sẽ không được chọn. Đó là tất cả về cách so sánh các cột ngày tháng trong SQL Server. Bạn có thể thấy rằng truy vấn SQL sai ngày rất dễ xảy ra. Đôi khi bạn cảm thấy truy vấn của mình hoạt động tốt nhưng lại không thành công trong môi trường thực, Tại sao? . Trong QA nếu bạn không có bất kỳ giá trị ngày nửa đêm nào thì mệnh đề ngày giữa sẽ hoạt động tốt nhưng nếu bạn có giá trị nửa đêm trong môi trường thực thì nó sẽ không thành công Cách đúng để so sánh các giá trị chỉ ngày với cột DateTime là sử dụng điều kiện '00. 00. 00. 000' và kết thúc tại "59. 59. 59. 999" . Cũng đáng ghi nhớ là khi bạn thực hiện date = '2015-10-08' và nếu ngày là cột DateTime thì SQL Server . 00. 00. giá trị 000'. Vì vậy, xin vui lòng nhận thức được điều đó. Nhân tiện, nếu bạn muốn thực hành các truy vấn SQL đầy thử thách thì bạn cũng có thể xem Joe Celko's SQL Puzzles and Answers, Second Edition, một trong những cuốn sách thú vị để cải thiện kỹ năng SQL. Các bài viết SQL Server khác mà bạn có thể thích
Học thêm Giới thiệu về SQL Chương trình đào tạo SQL hoàn chỉnh SQL cho người mới. Phân tích dữ liệu cho người mới bắt đầu Làm cách nào để so sánh hai ngày trong mệnh đề WHERE trong SQL?Bây giờ, chúng ta có thể so sánh ngày theo hai cách. . Sử dụng toán tử so sánh Sử dụng mệnh đề BETWEEN Sử dụng toán tử so sánh với TimeStamp Truyền DATETIME thành NGÀY mà không có Dấu thời gian Sử dụng Mệnh đề Giữa với DATETIME Làm cách nào để so sánh hai dấu thời gian trong MySQL?Để tính toán sự khác biệt giữa các dấu thời gian trong MySQL, hãy sử dụng hàm TIMESTAMPDIFF(đơn vị, bắt đầu, kết thúc) . Đối số đơn vị có thể là MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER hoặc Year. Để có sự khác biệt tính bằng giây như chúng ta đã làm ở đây, hãy chọn SECOND.
Làm cách nào để sử dụng mệnh đề WHERE cho ngày trong MySQL?Bạn nên sử dụng định dạng này trong biểu thức CẬP NHẬT và trong mệnh đề WHERE của câu lệnh CHỌN. Ví dụ. SELECT * FROM t1 WHERE date >= '2003-05-05'; Để thuận tiện, MySQL tự động chuyển đổi ngày thành số nếu ngày đó là .
Làm cách nào để so sánh hai trường ngày trong MySQL?Để đếm sự khác biệt giữa các ngày trong MySQL, hãy sử dụng hàm DATEDIFF(ngày kết thúc, ngày bắt đầu) . Sự khác biệt giữa ngày bắt đầu và ngày kết thúc được biểu thị bằng ngày. |