Sử dụng DATEDIFF
và DATEADD
để thay vào đó nhận được phần ngày của ngày giờ. So sánh cột với ngày tháng, và nó sẽ trả về những hàng có thời gian khác 0.
Cách hoạt động này là trước tiên chúng tôi tính toán sự khác biệt (tính theo ngày) giữa thời đại và giá trị. Chúng ta thêm số đó vào kỷ nguyên để tạo ra một datetime mới. Vì kết quả của DATEDIFF
là một số nguyên, mọi thành phần thời gian đều được làm tròn.
SELECT *
FROM Table
WHERE DateColumn <> DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
Chức năng thời gian sau đó có thể được thực hiện bởi những điều sau đây, không phải là tôi khuyên bạn nên nó cho kịch bản cụ thể này:
SELECT DATEDIFF(minute, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay,
-- or, if you require higher precision
DATEDIFF(second, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay
FROM Table
Edit: Như đã đề cập trong câu trả lời khác, bạn có thể đúc thành DATE
để đạt được hiệu quả tương tự như DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)
, làm sạch độc đáo. Tuy nhiên, DATE chỉ được thêm vào trong SQL Server 2008, trong khi công thức có khả năng tương thích trở lại ít nhất SQL 2000. Vì vậy, nếu bạn cần khả năng tương thích ngược hoặc đang xử lý SQL CE, việc truyền tới DATE là không có sẵn.
Có bất kỳ hạn chế/mối quan tâm nào với phương pháp này không? Nó có vẻ kỳ lạ với tôi rằng điều này đã quá lâu để được đề xuất (dựa trên câu trả lời khác) nếu điều này thực sự là cách tốt nhất? – Codingo
@Michael Không có giới hạn làm như thế này, ít nhất là không so với các câu trả lời khác.Điều xấu về việc áp dụng các hàm trên các cột như vậy là bất kỳ chỉ mục nào trên cột đó không thể được sử dụng và SQL Server phải thực hiện quét bảng để tìm ra những hàng bạn cần. –