Tôi có hai bảng trong đó cột [date]
là loại DATETIME2(0)
.
Tôi phải so sánh hai bản ghi chỉ theo phần Ngày của chúng (ngày + tháng + năm), loại bỏ phần Thời gian (giờ + phút + giây).
Làm thế nào tôi có thể làm điều đó?
Tôi có hai bảng trong đó cột [date]
là loại DATETIME2(0)
.
Tôi phải so sánh hai bản ghi chỉ theo phần Ngày của chúng (ngày + tháng + năm), loại bỏ phần Thời gian (giờ + phút + giây).
Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Một nhược điểm nhỏ trong câu trả lời của Marc là cả hai trường ngày đã được đánh máy, nghĩa là bạn sẽ không thể tận dụng bất kỳ chỉ mục nào.
Vì vậy, nếu có nhu cầu viết một truy vấn có thể hưởng lợi từ một chỉ mục trên trường ngày, thì cách tiếp cận (khá phức tạp) là cần thiết.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: Một cách khác để chỉ trích xuất ngày (trong các phiên bản SQL Server cũ hơn) là sử dụng một mẹo về cách ngày được thể hiện trong nội bộ.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Mặc dù tôi nêu lên câu trả lời được đánh dấu là chính xác. Tôi muốn chạm vào một vài điều cho bất cứ ai vấp phải điều này.
Nói chung, nếu bạn chỉ lọc cụ thể trên các giá trị Ngày . Microsoft khuyến nghị sử dụng định dạng trung tính ngôn ngữ của ymd
hoặc y-m-d
.
Lưu ý rằng biểu mẫu '2007-02-12' chỉ được coi là trung lập về ngôn ngữ đối với các loại dữ liệu DATE, DATETIME2 và DATETIMEOFFSET.
Để thực hiện so sánh ngày bằng cách sử dụng phương pháp đã nói ở trên là đơn giản. Hãy xem xét những điều sau đây, ví dụ giả định.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
Trong một thế giới hoàn hảo, nên tránh thực hiện bất kỳ thao tác nào đối với cột được lọc vì điều này có thể ngăn SQL Server sử dụng các chỉ mục một cách hiệu quả. Điều đó nói rằng, nếu dữ liệu bạn lưu trữ chỉ liên quan đến ngày và không phải thời gian, hãy xem xét việc lưu trữ như DATETIME
với nửa đêm là thời gian. Bởi vì:
Khi SQL Server chuyển đổi nghĩa đen thành loại cột được lọc, nó giả sử nửa đêm khi một phần thời gian không được chỉ định. Nếu bạn muốn bộ lọc như vậy trả về tất cả các hàng kể từ ngày đã chỉ định, bạn cần đảm bảo rằng bạn lưu trữ tất cả các giá trị với nửa đêm là thời gian.
Do đó, giả sử bạn chỉ quan tâm đến ngày và lưu trữ dữ liệu của mình như vậy. Truy vấn trên có thể được đơn giản hóa thành:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
Bạn có thể thử cái này
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
Tôi kiểm tra điều đó cho MS SQL 2014 bằng mã sau
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
Để so sánh hai ngày như MM / DD / YYYY với MM / DD / YYYY . Ghi nhớ Loại cột thứ nhất của Trường phải là dateTime. Ví dụ: cộtName: Payment_date dataType: DateTime .
sau đó bạn có thể dễ dàng so sánh nó Truy vấn là:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
Nó rất đơn giản ...... Nó đã thử nó .....