Làm cách nào tôi có thể so sánh hai ngày trong truy vấn mysql?

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?" . Khi bạn chỉ cung cấp phần ngày của biến DateTime, nó sẽ sử dụng

select * from table where date = '20151007'

It may or may not, it entirely depends on upon data in your table. When you only provide date part of a DateTime variable, it uses '00. 00. 00. 000' cho phần thời gian.

Vì vậy, nếu bạn có bất kỳ hàng nào có cùng ngày nhưng khác giờ thì truy vấn này sẽ không hoạt động. Ví dụ: bạn có bảng Đơn hàng nơi bạn có hai đơn hàng, một đơn hàng có order_date='20150107' và đơn hàng khác có order_date='20150107:01:00:00:000' , thì truy vấn trên sẽ chỉ trả về đơn đặt hàng đầu tiên. Tôi sẽ giải thích cách tìm các hàng giữa các ngày trong SQL Server chi tiết hơn trong bài viết này.

Nhiều lập trình viên Java hoặc C++ sử dụng SQL Server không chú ý đầy đủ đến kiểu dữ liệu của cột ngày tháng e. g. order_date, trade_date, v.v. và nhiều người trong số họ thậm chí không biết rằng SQL Server sẽ so sánh tình trạng của họ với dữ liệu trong cột đó như thế nào. Không có gì ngạc nhiên vì đối với họ SQL là kỹ năng phụ, trong khi C++ hoặc Java là kỹ năng chính, nhưng thành thật mà nói sẽ có rất ít ứng dụng trong thế giới thực mà bạn không phải làm việc trên SQL.

Vì vậy, nếu bạn muốn nâng cao kiến ​​thức của mình về các nguyên tắc cơ bản của SQL, đặc biệt là trong SQL Server, tôi khuyên bạn nên tham gia Microsoft SQL dành cho người mới bắt đầu để tìm hiểu thêm về các loại dữ liệu NGÀY, GIỜ và DATETIME. Tôi đã tham khảo cuốn sách đó trước khi viết bài này và nó đã giúp tôi rất nhiều trong việc lấp đầy lỗ hổng kiến ​​thức của mình.




Truy vấn so sánh ngày trong SQL

Để hiểu cách so sánh ngày trong SQL, hãy xem một ví dụ trong đó trường DateTime cũng có một số giá trị thời gian.

Giả sử chúng ta có bảng sau với varchar course_namedatetime course_date< . columns:

______0
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 trong '2015-10-07'? .

'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'

Hãy xem các giải pháp khác nhau 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.

______2
Bạn có thể thấy nó chỉ mang đến một hàng có thời gian bằng 0, nó không khớp với hai hàng còn lại có 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 đề giữa

Có 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.

______3
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áng

Câu trả lời đúng là sử dụng toán tử lớn hơn [>] và nhỏ hơn [= '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
You can see we got exactly three 3 rows as expected. Just remember to use < on the second predicate, this will ensure that  '2015-10-08 00:00:00.000' will not get picked up.

That's all about how to compare date columns in SQL Server. You can see that it's very easy to get the SQL query with date incorrect. Sometimes you feel your query is working fine but it failed in the real environment, Why? because of different data in both environment. In QA if you don't have any midnight date value then the date with between clause will work fine but if you a midnight value in the real environment it will fail.

The right way to compare date only values with a DateTime column is by using condition. This will ensure that you will get rows where date starts from midnight and ends before midnight e.g. dates starting with '00:00:00.000' and ends at "59:59:59.999".

Also worth remembering is that when you do date = '2015-10-08' and if the date is DateTime column then SQL Server will use '2015-10-08 00:00:00.000' value. So please aware of that. Btw, if you want to practice challenging SQL queries then you can also check Joe Celko's SQL Puzzles and Answers, Second Edition, one of the interesting books to improve SQL skill.




Các bài viết khác về SQL Server mà bạn có thể thích
  • Làm cách nào để nối ba bảng trong một Truy vấn SQL?
  • Làm cách nào để xóa khỏi bảng bằng phép nối trong SQL?
  • Làm cách nào để thay thế null bằng Chuỗi trống trong SQL Server?
  • Sự khác biệt giữa mệnh đề WHERE và HAVING trong SQL?
  • Làm cách nào để thêm các cột trên bảng hiện có trong Microsoft SQL Server?
  • Sự khác nhau giữa row_number[], rank[], vàdens_rank[] trong SQL?
  • Làm cách nào để tăng độ dài của cột varchar hiện có trong SQL Server?
  • Làm cách nào để chỉ lấy ngày hoặc giờ từ hàm GETDATE[] trong SQL Server?
  • Sự khác biệt giữa các truy vấn SQL trong Oracle và Microsoft SQL Server?
  • Làm cách nào để tìm độ dài của Chuỗi trong MSSQL?
  • Truy vấn SQL để tìm tất cả tên bảng trong cơ sở dữ liệu?

Further Learning
Introduction to SQL
The Complete SQL Bootcamp
SQL for Newbs: Data Analysis for Beginners

Tôi có thể so sánh ngày trong MySQL không?

MySQL có khả năng so sánh hai ngày khác nhau được viết dưới dạng biểu thức chuỗi . Khi bạn cần so sánh ngày giữa một cột ngày và một ngày tùy ý, bạn có thể sử dụng hàm DATE[] để trích xuất phần ngày từ cột của mình và so sánh nó với một chuỗi đại diện cho ngày bạn muốn.

Làm cách nào để so sánh hai trường ngày trong SQL?

Chúng ta có thể so sánh ngày tháng bằng cách sử dụng Toán tử so sánh trong SQL như, = [Bằng], < [Nhỏ hơn], > [Lớn hơn] .

Làm cách nào tôi có thể tính chênh lệch ngày giữa hai ngày trong MySQL?

Hàm DATEDIFF[] trả về số ngày giữa hai giá trị ngày.

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.

Chủ Đề