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