PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgresql के लिए स्वरूपण तिथि

ऐसा लगता है कि आप तर्क को सीधे स्ट्रिंग में जोड़कर पारित कर रहे हैं। यह एक बहुत बुरा विचार है, क्योंकि इससे SQL इंजेक्शन लग सकते हैं। हमेशा PreparedStatement का उपयोग करें एस ? . के साथ प्लेस-होल्डर्स को पैरामीटर पास करने के लिए, उन्हें सीधे क्वेरी स्ट्रिंग में जोड़कर सीधे पास न करें (अधिक तो, आपको ' की आवश्यकता होगी चारों ओर सीमांकक)।

आपके पास कुछ ऐसा हो सकता है:

 PreparedStatement stmt
     = con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=?")
 stmt.setDate(1, new java.sql.Date(cin.getTime()));
      // ? parameters are indexed from 1
 ResultSet results = stmt.executeQuery();

वैकल्पिक रूप से, PostgreSQL आंतरिक दिनांक रूपांतरण आमतौर पर काफी अच्छा और लचीला होता है। आप स्ट्रिंग पैरामीटर को पोस्टग्रेएसक्यूएल के साथ डेट पर कास्ट कर सकते हैं:

 PreparedStatement stmt
     = con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
 stmt.setString(1, cinDate);
 ResultSet results = stmt.executeQuery();

यह लचीला है, लेकिन हो सकता है कि आपको तिथि प्रारूप के आधार पर सटीक परिणाम न मिले (आप दिनांक रूपांतरण प्रारूपों के विवरण के लिए PostgreSQL मैनुअल की जांच कर सकते हैं)। आपके द्वारा उपयोग किया जा रहा इनपुट प्रारूप ठीक काम करना चाहिए, हालांकि (कोशिश करें SELECT CAST('2012-05-01' AS DATE) सीधे PostgreSQL में, उदाहरण के लिए, यह एक सही PostgreSQL दिनांक लौटाएगा।)

ध्यान दें कि new java.sql.Date(cin.getTime()) . का उपयोग करते समय , आपको समय क्षेत्र संबंधी समस्याओं का सामना करना पड़ सकता है। आप java.sql.Date.valueOf(...) . का उपयोग कर सकते हैं भी।

अपने संपादन के बाद स्पष्ट करने के लिए:

यह काम नहीं करेगा, क्योंकि तिथियां स्वयं SQL सिंटैक्स का हिस्सा होंगी, न कि तार या तिथियां:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"

आपको कम से कम ' . का उपयोग करना होगा उद्धरण:<स्ट्राइक> "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))" . यहां, कुछ हद तक, आप उम्मीद कर सकते हैं कि पैरामीटर ठीक से स्वरूपित होंगे, लेकिन ऐसा न करें। इसके अलावा, अभी भी CAST('...' AS DATE) का उपयोग करके स्ट्रिंग डालना होगा या '...'::DATE

सबसे आसान तरीका निश्चित रूप से होगा:

String searchQuery = "SELECT * FROM Rooms r where r.id not in (select SOMETHING from search(CAST(? AS DATE), CAST(? AS DATE)))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
ps.setString(1, cinDate);
ps.setString(2, coutDate);

(जैसा कि a_horse_with_no_name ने एक टिप्पणी में बताया है, आपके आंतरिक चयन के कारण सामान्य क्वेरी वैसे भी काम नहीं करेगी।)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. निर्यात में पीएल/पीजीएसक्यूएल कार्यों को कैसे बाहर निकालें?

  2. R . का उपयोग करके पोस्टग्रेज़ स्कीमा के भीतर तालिकाएँ सूचीबद्ध करें

  3. plpgsql में परेशान करने वाले नोटिस कम करें

  4. जावा और पोर्टग्रेएसक्यूएल के बीच खराब रिकॉर्ड मैक एसएसएल त्रुटि

  5. NpgSql कनेक्शन स्ट्रिंग में ApplicationName कैसे निर्दिष्ट करें?