2012-05-28 39 views
10

Tôi có một trường loại DB2 DATE trong một bảng DB2. Tôi muốn chọn dữ liệu theo bộ lọc ngày. Ví dụ:So sánh các ngày DB2

SELECT * 
FROM table 
WHERE registrationdate > '2002-10-01'; 

Từ truy vấn trên, tôi nhận được hồ sơ đăng ký bắt đầu từ '1943-10-01', nhưng điều này không chính xác.

Những điều này không làm việc, hoặc:

registrationdate > date('2002-10-01') 
date(registrationdate) > date('2002-10-01') 
date(registrationdate) > '2002-10-01' 

Làm thế nào để cần phải so sánh ngày?

+1

Làm thế nào là "registrationdate" cột được xác định? Có thể loại dữ liệu cột không phải là ngày, nếu có, thì truy vấn ban đầu của bạn sẽ hoạt động. – NealB

Trả lời

3

tôi khám phá một số vấn đề khác với cơ sở dữ liệu, sau khi khởi động lại nó bắt đầu để hoạt động, do đó, công trình này hoạt động chính xác ngay bây giờ:

registrationdate > '2002-10-01' 
13

Các tiêu chuẩn định dạng SQL cho một ngày đen là:

DATE '2002-10-01' 

Ít nhất, nó là giá trị cố gắng:

SELECT * 
    FROM table 
WHERE registrationdate > DATE '2002-10-01'; 
+0

nếu đăng ký được xác định là dấu thời gian, chỉ cần nói timestamp'2012-12-21 ' – fedvasu

0

Sử dụng định dạng này.

registrationdate > 'mm/dd/yyyy' 
+0

Giả sử rằng 'registrationDate' _is_ một loại ngày, việc thay đổi định dạng sẽ không có hiệu lực. Nếu nó là một cái gì đó giống như một loại char, điều này ** sẽ không hoạt động AT ALL ** - định dạng bạn đã chọn không sắp xếp độc đáo. ISO là định dạng được khuyến cáo tiêu chuẩn vì một lý do. –

3

Định dạng mặc định sử dụng cho những ngày được xác định bởi mã lãnh thổ của DB2 cơ sở dữ liệu (mà có thể được quy định tại thời gian tạo cơ sở dữ liệu). Ví dụ: cơ sở dữ liệu của tôi đã được tạo bằng cách sử dụng lãnh thổ = Hoa Kỳ. Do đó, định dạng ngày có dạng như sau:

values current date 
1 
---------- 
05/30/2003 

1 record(s) selected. 

Bạn có thể lấy mã lãnh thổ từ DB CFG.

db2 get db cfg | egrep 'code|territory' 
Database territory          = US 
Database code page          = 1208 
Database code set          = UTF-8 
Database country/region code       = 1 

Đó là, định dạng là MM/DD/YYYY. Nếu bạn muốn thay đổi định dạng, bạn có thể ràng buộc tập hợp các gói tiện ích db2 để sử dụng một định dạng ngày khác.

Để có được hiện nay, thời gian, và dấu thời gian sử dụng SQL, (về cơ bản cung cấp cho bạn một ý tưởng về những gì các định dạng ngày là) tham khảo các thanh ghi DB2 thích hợp: Bảng sysibm.sysdummy1 là một đặc biệt trong bộ nhớ bảng có thể được sử dụng để khám phá giá trị của DB2 đăng ký

db2 "SELECT current date FROM sysibm.sysdummy1 " 

1 
---------- 
06/02/2014 

    1 record(s) selected. 

các hàm DATE vẫn hoạt động ngay cả khi chúng ta bỏ qua các dấu ngoặc kép trong chức năng, nhưng kết quả là không đúng:

db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 " 

1 
---------- 
05/24/0006 

    1 record(s) selected. 

Khi hàm DATE nhận được một chuỗi ký tự làm đầu vào, nó giả định rằng nó là biểu diễn ký tự hợp lệ của một ngày DB2 và chuyển đổi nó cho phù hợp. Ngược lại, khi đầu vào là số, hàm này giả định rằng nó đại diện cho số ngày trừ đi một từ đầu của thời đại hiện tại (nghĩa là, 0001-01-01). Trong truy vấn trên, đầu vào là 2001-09-22, bằng (2001-9) -22, tương đương với 1970 ngày.

Và nếu tất cả những điều trên được áp dụng, lệnh dưới đây sẽ hoạt động tốt cho vấn đề của bạn.

SELECT * FROM table WHERE registrationdate > '10/01/2002';