2011-07-26 10 views
9

मैं गोरम का उपयोग करके Grails में एकीकरण परीक्षण लिख रहा हूं।ओरेकल to_date फ़ंक्शन का परीक्षण

मैं निम्नलिखित की तरह कुछ करना चाहता हूँ:

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

लेकिन मैं निम्नलिखित त्रुटि मिलती है:

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

मुझे लगता है कि त्रुटि GORM द्वारा प्रयुक्त स्मृति में डेटाबेस के कारण होता है (है यह H2?) to_date फ़ंक्शन का समर्थन नहीं कर रहा है।

एसक्यूएल को हटाने के तरीके पर कोई विचार है कि यह एक परीक्षण में और लाइव में काम करता है?

जैसा कि मुझे केवल महीने और साल के बारे में वास्तव में परवाह है, एक विचार मैंने उन रिकॉर्ड्स को हटाना होगा जहां stat_date दिए गए महीने की पहली और आखिरी तारीख के बीच है।

क्या कोई भी बेहतर तरीके से सोच सकता है?

उत्तर

6

हां, एच 2 TO_DATE का समर्थन नहीं करता है, यह 1.4.x roadmap में है। इसके बजाय आप फ़ंक्शन का उपयोग कर सकते हैं जो ओरेकल डीबी और एच 2 दोनों में मौजूद है।

+0

उत्कृष्ट, यह बहुत अच्छा काम करता है, सूचक के लिए धन्यवाद। – C0deAttack

3

या आप की तरह

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); 
} 
$$; 

अपनी खुद की TO_DATE परिभाषित कर सकते हैं http://www.h2database.com/html/features.html#user_defined_functions

24

देखना यह अभी भी गूगल पर नंबर 1 के रूप में आया है, इसलिए यहाँ खोज क्या मेरे लिए काम किया है।

मेरा यूनिट परीक्षण/स्थानीय वातावरण एसक्यूएल फाइलों का उपयोग करके स्कीमा का निर्माण और पॉप्युलेट करता है। मैं एसक्यूएल फ़ाइल

-- 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); 
} 
'; 

सूचना h2 user defined functions में बजाय $$ की एकल उद्धरण के उपयोग के रूप में है कि केवल प्रारूप है कि मेरे लिए काम किया है में निम्नलिखित उर्फ ​​बनाया।

+0

मैं लेखक नहीं हूं लेकिन मैं कहूंगा कि यह सही जवाब है। चूंकि चुनिंदा उत्तर एसक्यूएल को संशोधित करने का सुझाव देता है, हालांकि, यदि आप यूनिट परीक्षणों के लिए एच 2 का उपयोग करते हैं तो आप अपना टेस्ट केस काम करने के लिए अपना कोड नहीं बदलेंगे। –

6

मुझे ब्लूज़मैन के उत्तर को समायोजित करना था ताकि इसे हमारे ओरेकल एसक्यूएल में आमतौर पर उपयोग किए जाने वाले दिनांक स्वरूपों के लिए काम कर सकें।

इस संस्करण की तरह 'डीडी-सोम-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); 
} 
'; 

dateFormats का समर्थन करता है मैं इस ब्लॉग पोस्ट पर सुझाव पाया पता लगाना कैसे SimpleDateFormat के प्रारूपों में ओरेकल तिथि प्रारूप का अनुवाद करने में http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ उपयोगी।

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

अपना कोड समझाते हुए, हम जितना संभव हो सके एक समान समस्या के साथ प्रश्नों को उपयोगी बनाने की कोशिश करते हैं। – LionC

संबंधित मुद्दे