2013-02-27 4 views
7

Tôi có một cột lưu trữ dữ liệu ở định dạng ngày giờ. Tôi muốn kiểm tra tất cả các trường hợp trong đó phần thời gian của cột này không bằng 00: 00: 00: 000 - ngày không thành vấn đề.Làm cách nào để chỉ kiểm tra thời gian trên các trường ngày giờ nhưng bỏ qua ngày?

Về cơ bản, nếu thời gian() là một chức năng, một cái gì đó như thế này:

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

Làm thế nào để đi về việc này?

Trả lời

9

Bạn chỉ cần chỉnh sửa nhỏ về những gì bạn đã có.

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

Sử dụng CONVERT thay đổi của bạn DATETIME đến một TIME.

SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000' 
+0

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

+0

@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. –

3

Sử dụng DATEDIFFDATEADD để 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.

2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

Một cách khác là chuyển nó sang kiểu dữ liệu khác nhau, ví dụ:

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

Tôi làm điều này tất cả các thời gian khi cố gắng để xem nếu cột của một bảng nên biến thành một ngày thay vì một datetime, mà thực sự là câu trả lời.

select * 
from progen.dy 
where cast(dy_date as Date) <> dy_date 

diễn viên loại bỏ thời gian và ngày giờ có ưu tiên cao hơn, vì vậy khi so sánh, nếu không đồng đều thì nó có giá trị thời gian. Cùng một điều có thể được thực hiện với một diễn viên để thời gian, với một chút cú pháp khác nhau.