'0000-00-00 00:00:00' को java.sql.Timestamp त्रुटि के रूप में प्रस्तुत नहीं किया जा सकता है


141

मेरे पास एक डेटाबेस तालिका है जिसमें दिनांक हैं

 (`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

मैं MySQL का उपयोग कर रहा हूं। कार्यक्रम से कभी-कभी डेटा को डेट के बिना डेटाबेस में पारित किया जाता है। इसलिए, 0000-00-00 00:00:00 तालिका मान को उस त्रुटि स्तंभ के साथ निर्दिष्ट किया जाता है, जब दिनांक डेटा स्तंभ दिया जाता है

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......

मैंने डेटा सम्मिलित करते समय दिनांक को शून्य मान देने का प्रयास किया, लेकिन यह वर्तमान समय में असाइन हो जाता है।

क्या कोई तरीका है जिससे मैं ResultSetटेबल संरचना को बदले बिना प्राप्त कर सकता हूं ?

जवाबों:


302

आप इस JDBC URL का उपयोग सीधे अपने डेटा स्रोत कॉन्फ़िगरेशन में कर सकते हैं:

JDBC: mysql: // yourserver: 3306 / yourdatabase zeroDateTimeBehavior = convertToNull


2
जिज्ञासु। अन्य उत्तरों को पढ़ते हुए, दोह, कोई महीना शून्य नहीं है। इसका वास्तव में क्या मतलब है?
थोफिर

2
क्या आपको पता है कि मेरे jdbc URL में परिशिष्ट के बराबर एक MariaDB है? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = ConvertToNull मेरे लिए काम नहीं करता है।
jeffkempf

मेरे लिए CONVERT_TO_NULL होना था
२३:२३

16

"दिनांक" 0000-00-00 "मान्य है या नहीं" तिथि "सवाल के लिए अप्रासंगिक है।" बस डेटाबेस बदलें "शायद ही कभी एक व्यवहार्य समाधान है।

तथ्य:

  • MySQL शून्य के मान के साथ एक तारीख की अनुमति देता है।
  • इस "सुविधा" को अन्य भाषाओं के साथ व्यापक उपयोग प्राप्त है।

तो, अगर मैं "बस डेटाबेस में परिवर्तन करता हूं", तो PHP कोड की हजारों लाइनें टूट जाएंगी।

जावा प्रोग्रामर को MySQL शून्य-तिथि को स्वीकार करने की आवश्यकता होती है और उन्हें डेटाबेस में शून्य तिथि डालने की आवश्यकता होती है, जब अन्य भाषाएं इस "सुविधा" पर भरोसा करती हैं।

MySQL से जुड़ने वाले एक प्रोग्रामर को शून्य और 0000-00-00 के साथ-साथ वैध तिथियों को संभालने की आवश्यकता होती है। शून्य से 0000-00-00 को बदलना एक व्यवहार्य विकल्प नहीं है, क्योंकि तब आप यह निर्धारित नहीं कर सकते हैं कि डेटाबेस में वापस लिखने के लिए तारीख 0000-00-00 होने की उम्मीद थी।

0000-00-00 के लिए, मैं एक स्ट्रिंग के रूप में दिनांक मान की जाँच करने का सुझाव देता हूं, फिर इसे ("y", 1), या ("yyyy-MM-dd", 0001-01-01), या किसी भी अमान्य में बदल रहा हूं MySQL दिनांक (वर्ष 1000 से कम, iirc)। MySQL में एक और "फीचर" है: निम्न तिथियां स्वतः 0000-00-00 में बदल जाती हैं।

मुझे पता है कि मेरा सुझाव एक कीचड़ है। लेकिन ऐसा है MySQL की तारीख संभालना। और दो कीचड़ इसे सही नहीं बनाते हैं। इस तथ्य का तथ्य यह है, कई प्रोग्रामर को MySQL शून्य-तिथियों को हमेशा के लिए संभालना होगा


9

JDBC-mysql प्रोटोकॉल के लिए निम्नलिखित कथन जोड़ें:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

उदाहरण के लिए:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

5
इस दृष्टिकोण से सावधान रहें। यह एक आकर्षण की तरह काम करता है, लेकिन इसने हम पर एक प्रोडक्शन सर्वर को ले लिया (पूरी तरह से काम में यद्यपि ...)। हमने जो सीखा वह यह है कि आपको स्ट्रिंग को उद्धृत करने की आवश्यकता होगी क्योंकि & को कुछ संदर्भों में एक विशेष चरित्र के रूप में व्याख्या की जाती है जो लाइन को पूरी तरह से अलग अर्थ देता है ...
Techmag

6

मानों को अनुमति देने के लिए 0000-00-00 00:00:00या 0001-01-01 00:00:00( जैसे कि यह एक मान्य दिनांक है) बाद में नकली तिथियों का उपयोग करना चाहिए, अपने डेटाबेस स्कीमा को बदलें NULL

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

जब आप अपनी तिथि कॉलम में परिवर्तन नहीं कर सकते हैं या मूल्यों को अपडेट करने के लिए, या जब ये संशोधन होते हैं, तब आप एक मामले का उपयोग करके चयन कर सकते हैं।

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1;

1

मैंने इस समस्या के साथ कुश्ती की और ऊपर स्वीकार किए गए उत्तर में @ कुशन द्वारा योगदान किए गए URL कॉन्सेप्टेशन समाधान को लागू किया। यह मेरे स्थानीय MySql उदाहरण में काम किया। लेकिन जब मैंने Heroku को अपना Play / Scala ऐप तैनात किया तो यह काम नहीं करेगा। हरोकू डीबी यूआरएल के लिए कई तर्क प्रस्तुत करता है कि वे उपयोगकर्ताओं को प्रदान करते हैं, और यह समाधान, हर्को के उपयोग के कारण "?" आर्ग्स के अपने सेट से पहले, काम नहीं करेगा। हालांकि मुझे एक अलग समाधान मिला जो समान रूप से अच्छी तरह से काम करता है।

SET sql_mode = 'NO_ZERO_DATE';

मैंने इसे अपनी तालिका के विवरणों में रखा और इसने '0000-00-00 00:00:00' की समस्या को हल किया, इसे java.sql.Timestamp के रूप में प्रस्तुत नहीं किया जा सकता है


1

आप इस तरह की कोशिश कर सकते हैं

ArrayList<String> dtlst = new ArrayList<String>();
String qry1 = "select dt_tracker from gs";

Statement prepst = conn.createStatement();
ResultSet rst = prepst.executeQuery(qry1);
while(rst.next())
{
    String dt = "";
    try
    {
        dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker");
    }
    catch(Exception e)
    {
        dt = "0000-00-00 00:00:00";
    }

    dtlst.add(dt);
}

0

कोई साल 0000 था और कोई महीना 00 या दिन 00 नहीं था। मेरा सुझाव है कि आप कोशिश करें

0001-01-01 00:00:00

जबकि एक वर्ष को कुछ मानकों में परिभाषित किया गया है, यह उपयोगी IMHO की तुलना में भ्रमित होने की अधिक संभावना है।


2
हां, एक वर्ष 0000 है। इसके वर्ष 0 को संक्रमित करें और हमारे पास एक वर्ष -1 और एक वर्ष -1000 है। कभी इस ग्रेगोरियन कैलेंडर को नहीं देखा या इस अन्नो डोमिनी और अधिक विशिष्ट रूप से ग्रेगोरियन कैलेंडर में एक वर्ष शून्य नहीं है, लेकिन आइसो है और आइसो का उपयोग किया जाता है bij कंप्यूटर देखें 0 वर्ष
botenvouwer

@sirwilliam उस दिलचस्प योग्यता के लिए धन्यवाद। यह प्रतीत होता है कि ओपी चाहता था कि वर्ष 0 को एक पूर्ण या ऐसी चीज के रूप में माना जाए जो मौजूद नहीं है।
पीटर लॉरी

1
MySQL में 0000-00-00 00:00:00 के बराबर है। विरासत कोड में कुछ प्रश्न हो सकते हैं जो इस पर निर्भर करते हैं।
जूहा पालोमकी


0

मुझे पता है कि यह देर से जवाब देने वाला है, हालांकि यहां सबसे सही जवाब है।

MySQL डेटाबेस में, अपना timestampडिफ़ॉल्ट मान बदलें CURRENT_TIMESTAMP। यदि आपके पास नकली मूल्य के साथ पुराने रिकॉर्ड हैं, तो आपको उन्हें मैन्युअल रूप से ठीक करना होगा।


यह भी मदद नहीं करेगा।
सुनील शर्मा

0

यदि आवश्यक न हो तो आप अपने कॉलम "my nql" में अपने कॉलम से हटा सकते हैं। जब आप "00,00-00-00 00:00:00" रूपांतरण के लिए कोई ज़रूरत नहीं है, तो "रूपांतरण" और समस्या दूर हो जाती है।

कम से कम मेरे लिए काम किया।


-2

मेरा मानना ​​है कि यह मदद के लिए पूर्ण है, जो नीचे मिल रहे हैं, जो लॉगस्टैश त्रुटि के माध्यम से डेटा पंप करने के लिए अपवाद पर है: logstash.inputs.jdbc - JDBC क्वेरी को निष्पादित करते समय अपवाद {: अपवाद => #}

उत्तर: JDBC: mysql: // स्थानीय होस्ट: 3306 / Database_Name zeroDateTimeBehavior = convertToNull "

या यदि आप mysql के साथ काम कर रहे हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.