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

जावा में पैरामीटर का प्रकार क्या होना चाहिए जब यह पोस्टग्रेस्क्ल में समय क्षेत्र के बिना टाइमस्टैम्प हो?

tl;डॉ

SQL के लिए हाफ-ओपन स्पैन-ऑफ-टाइम का उपयोग करते हुए:
"SELECT * FROM tbl WHERE when !< ? AND when < ? ; "

myPreparedStatement.setObject(       // Use a prepared statement so you can pass smart objects rather than dumb strings.
    1 ,                              // Specify which placeholder is being fulfilled.
    LocalDate                        // Represent a date-only value, without time-of-day and without time zone or offset-from-UTC.
    .parse( "2014-11-20" )           // Parse an input string in standard ISO 8601 format to get a `LocalDate` object.
    .atStartOfDay()                  // Determine the first moment of the day on that date. Returns a `LocalDateTime` object representing a date with time-of-day but lacking any concept of time zone or offset-from-UTC.
) ;
myPreparedStatement.setObject( 
    2 , 
    LocalDate
    .parse( "2014-11-21" )
    .atStartOfDay()
) ;

सावधान रहें:मुझे लगता है कि आप अपने डेटाबेस में अपने कॉलम के लिए गलत प्रकार का उपयोग कर रहे हैं। क्षणों को केवल TIMESTAMP WITH TIME ZONE से ही ट्रैक किया जा सकता है , नहीं TIMESTAMP WITHOUT TIME ZONE . अधिक जानकारी के लिए स्टैक ओवरफ़्लो खोजें।

एक पल नहीं

जेन्स का उत्तर अब पुराना हो चुका है। आजकल आपको आधुनिक java.time . का उपयोग करना चाहिए ऐसी कक्षाएं जिन्होंने परेशानी वाली पुरानी विरासत की तारीख-समय की कक्षाओं को प्रतिस्थापित किया।

Postgres और SQL मानक दोनों पर इस डेटा प्रकार में जानबूझकर ऑफ़सेट-से-UTC या समय क्षेत्र के संदर्भ का अभाव है। तो, सावधान रहें, यह प्रकार एक क्षण का प्रतिनिधित्व नहीं कर सकता, नहीं . है समयरेखा पर एक बिंदु।

नहीं, गलत डेटा प्रकार। विरासती होने के अलावा, और डिज़ाइन में बहुत त्रुटिपूर्ण होने के कारण, java.sql.Timestamp वर्ग एक क्षण का प्रतिनिधित्व करता है, समयरेखा पर एक विशिष्ट बिंदु। तो यह आपके प्रकार के कॉलम के साथ एक बेमेल है TIMESTAMP WITHOUT TIME ZONE .

LocalDateTime

इसके बजाय आपको LocalDateTime . का उपयोग करना चाहिए कक्षा। यह वर्ग दिन के समय के साथ एक तारीख का प्रतिनिधित्व करता है लेकिन इसमें ऑफसेट या समय क्षेत्र की कोई अवधारणा नहीं है।

डेटाबेस से एक मान प्राप्त करने के लिए।

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

डेटाबेस को एक मान भेजने के लिए।

myPreparedStatement.setObject( … , ldt ) ;

दिन की शुरुआत

आपके यहां एक और बेमेल है। आप केवल-दिनांक मान प्रदान कर रहे हैं लेकिन आपके कॉलम में दिनांक-दर-समय-दिन के मान हैं।

एक और समस्या:आप गूंगा तारों का उपयोग कर रहे हैं जहां आपको स्मार्ट ऑब्जेक्ट्स का उपयोग करना चाहिए। JDBC 4.2 के अनुसार हम java.time . का आदान-प्रदान कर सकते हैं डेटाबेस के साथ ऑब्जेक्ट। एक PreparedStatement का प्रयोग करें प्लेसहोल्डर्स के साथ, और वस्तुओं को `सेट

. के माध्यम से पास करें

समय-समय की समस्या के साथ तिथि को हल करने के लिए, हमें दिन की शुरुआत निर्धारित करने की आवश्यकता है। LocalDateTime . के साथ , हमारे पास हिसाब करने के लिए कोई समय क्षेत्र विसंगतियां नहीं हैं। तो दिन हमेशा 00:00 बजे शुरू होता है। फिर भी, हमें java.time . पूछने की आदत डाल लेनी चाहिए दिन की शुरुआत निर्धारित करने के लिए।

LocalDate startDate = LocalDate.parse( "2014-11-20" ) ;
LocalDate stopDate = LocalDate.parse( "2014-11-21" ) ;

LocalDateTime start = startDate.atStartOfDay() ;
LocalDateTime stop = stopDate.atStartOfDay() ;

प्लेसहोल्डर्स के साथ आपको SQL लिखें।

मेरा सुझाव है कि आप समय-समय पर परिभाषित करने के लिए हाफ-ओपन दृष्टिकोण की आदत बनाने के लिए अपनी सोच बदलें। हाफ-ओपन में, शुरुआत समावेशी है जबकि अंत अनन्य है . इसलिए 20 तारीख के पूरे दिन के लिए, 20 तारीख के बराबर या उसके बाद की तारीखें खोजें, और उस तक चलकर नहीं सहित, 21. उस पहले भाग के लिए, "बराबर या बाद में" कहने का एक छोटा तरीका "पहले नहीं" है, इसलिए हम !< का उपयोग करते हैं .

String sql = "SELECT * FROM tbl WHERE when !< ? AND when < ? ; " ;

फ़ीड करें कि sql अपने तैयार कथन के लिए स्ट्रिंग। फिर दो LocalDateTime . पास करें प्लेसहोल्डर्स के लिए ऑब्जेक्ट।

myPreparedStatement.setObject( 1 , start ) ;
myPreparedStatement.setObject( 2 , stop ) ;


  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. PostgreSQL में पावर () फ़ंक्शन कैसे काम करता है

  3. सीक्वेलाइज पोस्टग्रेज नोडज का उपयोग करके उपयोगकर्ता एक-दूसरे को कैसे पसंद कर सकते हैं?

  4. पोस्टग्रेज में एक जेसन सरणी को पंक्तियों में कैसे बदलें

  5. Postgresql में पूर्णांक बढ़ाने के लिए परमाणु अद्यतन