2011-07-26 39 views
9

Tôi đang viết một bài kiểm tra tích hợp trong Grails bằng GORM.Kiểm tra hàm Oracle to_date

tôi muốn làm một cái gì đó như sau:

delete from Statistic 
where stat_date = TO_DATE(:month_year, 'MON-YYYY') 

Nhưng tôi nhận được lỗi sau:

java.sql.SQLException: Unexpected token: TO_DATE in statement [delete from statistics where stat_date=TO_DATE(?, 'MON-YYYY')]

Tôi nghĩ rằng lỗi là do trong bộ nhớ cơ sở dữ liệu được sử dụng bởi GORM (là nó H2?) không hỗ trợ chức năng to_date.

Bất kỳ ý tưởng nào về cách viết SQL xóa sao cho nó hoạt động trong thử nghiệm và trực tiếp?

Vì tôi chỉ thực sự quan tâm đến tháng và năm mà tôi nghĩ là tôi sẽ xóa các bản ghi trong đó stat_date là giữa ngày đầu tiên và ngày cuối cùng của tháng đã cho.

Có thể ai nghĩ đến một cách tốt hơn không?

Trả lời

6

Có, H2 không hỗ trợ TO_DATE, số này là 1.4.x roadmap. Thay vào đó, bạn có thể sử dụng hàm EXTRACT tồn tại cả trong Oracle DB và H2.

+0

Tuyệt vời, điều này đã hoạt động rất tốt, cảm ơn con trỏ. – C0deAttack

3

Hoặc bạn có thể xác định TO_DATE của riêng bạn như

CREATE ALIAS TO_DATE AS $$ 
java.util.Date to_date(String value, String format) throws java.text.ParseException { 

java.text.DateFormat dateFormat = new java.text.SimpleDateFormat(format); 
    return dateFormat.parse(value); 
} 
$$; 

thấy http://www.h2database.com/html/features.html#user_defined_functions

24

này vẫn đi lên như số 1 trên google tìm kiếm vì vậy đây là những gì làm việc cho tôi.

Thử nghiệm đơn vị của tôi/xây dựng môi trường cục bộ và điền giản đồ bằng tệp sql. Tôi tạo ra cho bí danh sau trong file sql

-- TO_DATE 
drop ALIAS if exists TO_DATE; 
CREATE ALIAS TO_DATE as ' 
import java.text.*; 
@CODE 
java.util.Date toDate(String s, String dateFormat) throws Exception { 
    return new SimpleDateFormat(dateFormat).parse(s); 
} 
'; 

Thông báo việc sử dụng dấu nháy đơn thay vì $$ trong h2 user defined functions như đó là định dạng duy nhất mà làm việc cho tôi.

+0

Tôi không phải là tác giả nhưng tôi sẽ nói đây là câu trả lời đúng. Bởi vì câu trả lời được chọn đề nghị sửa đổi SQL, tuy nhiên, nếu bạn sử dụng H2 cho các bài kiểm tra Đơn vị, bạn sẽ không thay đổi mã của bạn để làm cho trường hợp thử nghiệm của bạn hoạt động. –

6

Tôi đã phải điều chỉnh câu trả lời của bluesman để làm cho nó hoạt động cho các định dạng ngày thường được sử dụng trong sql Oracle của chúng tôi.

Phiên bản này hỗ trợ dateFormats như 'DD-MON-YYYY'

-- TO_DATE 
drop ALIAS if exists TO_DATE; 
CREATE ALIAS TO_DATE as ' 
import java.text.*; 
@CODE 
java.util.Date toDate(String s, String dateFormat) throws Exception { 
    if (dateFormat.contains("MON")) { 
     dateFormat = dateFormat.replace("MON", "MMM"); 
    } 
    if (dateFormat.contains("Y")) { 
     dateFormat = dateFormat.replaceAll("Y", "y"); 
    } 
    if (dateFormat.contains("D")) { 
     dateFormat = dateFormat.replaceAll("D", "d"); 
    } 
    return new SimpleDateFormat(dateFormat).parse(s); 
} 
'; 

tôi tìm thấy những lời khuyên về bài viết trên blog này http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ hữu ích trong việc tìm hiểu làm thế nào để dịch các định dạng ngày Oracle sang định dạng SimpleDateFormat của.

5
java.util.Date toDate(String dateTime, String dateFormat) throws Exception { 
    if (dateFormat.contains("MON")) { 
     dateFormat = dateFormat.replace("MON", "MMM"); 
    } 
    if (dateFormat.contains("Y")) { 
     dateFormat = dateFormat.replaceAll("Y", "y"); 
    } 
    if (dateFormat.contains("D")) { 
     dateFormat = dateFormat.replaceAll("D", "d"); 
    } 
    if (dateFormat.contains("HH")) { 
     dateFormat = dateFormat.replaceAll("HH", "hh"); 
    } 
    if (dateFormat.contains("hh24")) { 
     dateFormat = dateFormat.replaceAll("hh24", "hh"); 
    } 
    if (dateFormat.contains("MI") || dateFormat.contains("mi")) { 
     dateFormat = dateFormat.replaceAll("MI", "mi").replaceAll("mi", "mm"); 
    } 
    if (dateFormat.contains("SS")) { 
     dateFormat = dateFormat.replaceAll("SS", "ss"); 
    } 
    return new SimpleDateFormat(dateFormat).parse(dateTime); 
} 
+0

xem xét giải thích mã của bạn, chúng tôi cố gắng đặt câu hỏi hữu ích cho mọi người có vấn đề tương tự nhất có thể. – LionC

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