2013-04-16 113 views
6

Tôi cần bao gồm so sánh ngày trong truy vấn của mình, nơi tôi so sánh chuỗi ngày với cột DATETIME nhưng tôi cần nó để hoạt động trên cả ORACLE và SQL Server và không có hai riêng biệt truy vấn. Có bất kỳ so sánh ngày nào sẽ hoạt động trên cả oracle và sql không?SQL phổ biến để so sánh ngày tháng trong SQL Server và ORACLE

ORACLE:

Select * from MyTable where myDate > DATE '2013-04-10' 

SQL Server:

Select * from MyTable where myDate > convert(DATETIME,'2013-04-10', 126) 
+0

@Aaron Bertrand Không có tác phẩm nào ở trên không hoạt động trong oracle. Lỗi của nó nói rằng đó là tháng không hợp lệ. – CathalMF

+0

@CathalMF mà [phụ thuộc vào cài đặt NLS của bạn] (http://www.sqlfiddle.com/#!4/d41d8/9820) như đã đề cập bởi Ed. –

+0

@JackDouglas - bạn chính xác; Tôi phóng đại điểm đó. Tôi nên nói "lộn xộn" hoặc "mạo hiểm" và để nó ở đó. Tôi sẽ chỉnh sửa bình luận. –

Trả lời

5

vấn đề di này chỉ áp dụng với literals.

Tôi không tin rằng có một cách hoàn toàn di động để thực hiện điều này vì SQL Server không hỗ trợ từ khóa ANSI theo ngữ cảnh DATE và tất cả các hàm CAST, CONVERT, TO_DATE và ngày không giống nhau trên tất cả các nền tảng.

Lưu ý rằng truy vấn thứ hai của bạn cũng có thể được viết là Select * from MyTable where myDate > '20130410'.

Sẽ rất tuyệt nếu có hỗ trợ trong SQL Server cho tính năng chữ ANSI DATE (DB/2 và Teradata đều có tính năng này).

Tôi không thể tìm thấy mục Kết nối về điều này, cũng như bất cứ điều gì về lý do tại sao SQL Server không hỗ trợ các từ khóa ANSI DATE, TIME và TIMESTAMP.

Tôi tự hỏi trong trường hợp của bạn, liệu có thể sử dụng tham số thay thế không?

Giải pháp trong nhận xét của Jack Common SQL to compare dates in SQL Server and ORACLE sẽ làm cho mã này di động, nhưng bạn sẽ phải có chức năng vô hướng vô hướng. Đây có thể là một lựa chọn khả thi cho bạn - lưu ý rằng trong SQL Server, bạn sẽ cần tiền tố hàm vô hướng với lược đồ của nó - điều này có thể giới thiệu một nếp nhăn khác giữa mã Oracle và mã SQL nếu bạn không thể tạo các lược đồ cùng tên (lưu ý trong Oracle, tiền tố có thể là tên của gói thay vì lược đồ nếu bạn đặt hàm bên trong gói)

1

Việc xác định các hàm do người dùng xác định của bạn có được phép không? Bạn có thể tạo một hàm tóm tắt mã cụ thể DBMS và trả về kết quả 'Đúng' hoặc 'Sai' theo nghĩa đen.

[MSSQL User Defined Functions:] http://msdn.microsoft.com/en-ca/library/ms186755.aspx

[Oracle User Defined Functions] http://ocs.oracle.com/cd/B19306_01/server.102/b14200

Oracle dường như không cho phép người dùng định nghĩa để trả về một kiểu Boolean, do đó, một chuỗi (hoặc số) kết quả là cần thiết.

+1

tại sao không chỉ tạo một hàm nhận chuỗi và trả về một ngày? –

+0

Vì anh ấy yêu cầu thử nghiệm để áp dụng cho một hàng. – marceljg

+4

'chọn * từ MyTable nơi myDate> give_me_the_date ('2013-04-10')' –

Các vấn đề liên quan