So sánh phần thời gian bỏ qua DATETIME và DATE


151

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:


252

Sử dụng kiểu dữ liệu CASTmới DATEtrong SQL Server 2008 để chỉ so sánh phần ngày:

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

61

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.

  • Trường ngày được lập chỉ mục (gọi nó là DF1) phải được xử lý bởi bất kỳ loại chức năng nào.
  • Vì vậy, bạn phải so sánh DF1 với toàn bộ phạm vi giá trị datetime cho ngày DF2.
  • Đó là từ phần ngày của DF2, đến phần ngày trong ngày sau DF2.
  • I E (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • LƯU Ý : Điều rất quan trọng là việc so sánh là > = (bình đẳng cho phép) với ngày DF2 và (đúng) < ngày sau DF2. Ngoài ra, toán tử BETweEN không hoạt động vì nó cho phép sự bình đẳng ở cả hai phía.

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ộ.

  • Đúc ngày như một cái phao.
  • Cắt bớt phần phân số
  • Truyền giá trị trở lại thời gian
  • I E CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

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 ymdhoặ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ư DATETIMEvớ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

3

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

-3

Để 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ó .....


Điều này không hoàn toàn trả lời câu hỏi. Nó truy vấn trong một tháng, không phải một ngày.
Curtis Yallop

Đối với truy vấn tháng 3 của bạn: Nếu ngày là '3/31/2015' lúc 13:00, nó sẽ không được tìm thấy. Bạn nên sử dụng <'4/1/2015'.
Curtis Yallop

Cũng xem xét sử dụng định dạng ngày quốc tế '2015-03-01'. Ở Canada (và nhiều nơi khác), một định dạng chính thức là DD / MM / YYYY, khiến cả hai định dạng mơ hồ và có vấn đề.
Curtis Yallop

Câu trả lời này không giải quyết 2 bảng, như yêu cầu trong câu hỏi.
Curtis Yallop

Có tôi đồng ý, nhưng tôi chỉ chứng minh giải pháp chứ không phải giải pháp quốc tế .. bạn phải thay đổi một số thứ tự ...
pankaj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.