'0000-00-00 00:00:00' java.sql.Timestamp ত্রুটি হিসাবে উপস্থাপন করা যাবে না


141

আমার কাছে একটি ডেটাবেস টেবিল রয়েছে যার সাথে খেজুর রয়েছে

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

আমি মাইএসকিউএল ব্যবহার করছি। প্রোগ্রাম থেকে কখনও কখনও ডেটাবেস তারিখ ছাড়াই ডেটাবেস হয়। সুতরাং, তারিখের মানটি স্বয়ংক্রিয়ভাবে নির্ধারিত হয় 0000-00-00 00:00:00 যখন সারণীর ডেটাটি তারিখ কলামের সাথে ত্রুটি দেয় তার সাথে ডাকা হয়

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

আমি তথ্য সন্নিবেশ করার সময় তারিখের নাল মানটি দেওয়ার চেষ্টা করেছি, তবে এটি বর্তমান সময়ের জন্য নির্ধারিত হয়।

ResultSetটেবিলের কাঠামো পরিবর্তন না করে আমি কীভাবে পাব ?

উত্তর:


302

আপনি সরাসরি আপনার ডেটা উত্স কনফিগারেশনে এই জেডিবিসি ইউআরএল ব্যবহার করতে পারেন:

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


2
অদ্ভুত। অন্যান্য উত্তরগুলি পড়া, দুহ, কোনও মাসের শূন্য নেই। এর সত্যিকার অর্থ কী?
থুফির

2
আপনি কি জানেন যে আমার জেডিবিসি ইউআরএল যুক্ত করার মতো কোনও মারিয়াডিবি আছে কিনা? jdbc: মারিয়্যাডবি: // লোকালহোস্ট: 3306 / দেব? শূণ্য তারিখটাইমবিভাভিয়ার = রূপান্তরআপনি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে।
jeffkempf

আমার জন্য CONVERT_TO_NULL হতে হয়েছিল
23:23

16

"তারিখ" "0000-00-00" বৈধ "তারিখ" কিনা তা প্রশ্নের সাথে অপ্রাসঙ্গিক। "কেবল ডাটাবেস পরিবর্তন করুন" খুব কমই একটি কার্যকর সমাধান solution

তথ্য:

  • মাইএসকিউএল জিরোসের মান সহ একটি তারিখের অনুমতি দেয়।
  • এই "বৈশিষ্ট্য" অন্যান্য ভাষার সাথে ব্যাপক ব্যবহার উপভোগ করে।

সুতরাং, আমি যদি "কেবল ডাটাবেস পরিবর্তন করি", পিএইচপি কোডের কয়েক হাজার লাইন ভেঙে যাবে।

জাভা প্রোগ্রামারদের মাইএসকিউএল শূন্য-তারিখ গ্রহণ করতে হবে এবং অন্যান্য ভাষা এই "বৈশিষ্ট্য" এর উপর নির্ভর করে যখন তাদের একটি শূন্য তারিখটি ডাটাবেসে রেখে দেওয়া দরকার।

মাইএসকিউএলে সংযুক্ত কোনও প্রোগ্রামারকে নাল এবং 0000-00-00 পাশাপাশি বৈধ তারিখগুলি পরিচালনা করতে হবে। 0000-00-00 নালিতে পরিবর্তন করা একটি কার্যকর বিকল্প নয়, কারণ তখন আপনি আর নির্ধারণ করতে পারবেন না যে ডাটাবেসে ফিরে লেখার জন্য তারিখটি 0000-00-00 হওয়ার আশা করা হয়েছিল কিনা।

0000-00-00 এর জন্য, আমি তারিখের মানটি স্ট্রিং হিসাবে যাচাই করে তারপরে ("y", 1), বা ("yyyy-MM-dd", 0001-01-01) বা কোনও অবৈধে রূপান্তরিত করার পরামর্শ দিচ্ছি মাইএসকিউএল তারিখ (1000 বছরের কম, iirc)। মাইএসকিউএলের আরও একটি "বৈশিষ্ট্য" রয়েছে: কম তারিখগুলি স্বয়ংক্রিয়ভাবে 0000-00-00 এ রূপান্তরিত হয়।

আমি বুঝতে পারি আমার পরামর্শটি একটি ক্লডজ। তবে মাইএসকিউএলের ডেট হ্যান্ডলিং। এবং দুটি ক্লোজেজ এটি সঠিক করে না। বিষয়টির বাস্তবতা হল, অনেক প্রোগ্রামারকে মাইএসকিউএলকে জিরো-ডেটগুলি চিরকাল পরিচালনা করতে হবে


9

জেডিবিসি-মাইএসকিএল প্রোটোকলে নিম্নলিখিত বিবৃতিটি যুক্ত করুন:

?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
এই পদ্ধতির সাথে সতর্কতা অবলম্বন করুন। এটি একটি কবজির মতো কাজ করে তবে এটি আমাদের উপর একটি প্রোডাকশন সার্ভার নামিয়ে নিয়েছে (যদিও পুরোপুরিভাবে দেবটিতে কাজ করেছে ...)। আমরা যা শিখেছি তা হল আপনার স্ট্রিংটির উদ্ধৃতি দিতে হবে এবং কিছু প্রসঙ্গে একটি বিশেষ চরিত্র হিসাবে ব্যাখ্যা করা হয়েছে যা লাইনটিকে সম্পূর্ণ আলাদা অর্থ দেয় ...
টেকমগ

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

আমি এই সমস্যাটির সাথে লড়াই করেছি এবং উপরের গৃহীত উত্তরে @ কুশন দ্বারা অবদান করা ইউআরএল কনটেনটেশন সমাধানটি প্রয়োগ করেছি। এটি আমার স্থানীয় মাইএসকিএল উদাহরণে কাজ করেছে। তবে যখন আমি আমার প্লে / স্কাল অ্যাপটি হিরোকুর কাছে নিযুক্ত করি তখন এটি আর কাজ করে না। হিরোকু ডিবি ইউআরএলকে বেশ কয়েকটি যুক্তিও সহ্য করে যা তারা ব্যবহারকারীদের সরবরাহ করে এবং এই সমাধানটি হেরোকুর ব্যবহার "" এর সাথে যুক্ত করার কারণে? " তাদের নিজস্ব আরগস সেট করার আগে, কাজ করবে না। তবে আমি একটি ভিন্ন সমাধান পেয়েছি যা সমানভাবে ভালভাবে কাজ করে বলে মনে হচ্ছে।

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

যদিও এক বছর 0 কে কিছু মান হিসাবে সংজ্ঞায়িত করা হয়েছে, তবে এটি দরকারী আইএমএইচওর চেয়ে বিভ্রান্ত হওয়ার সম্ভাবনা বেশি।


2
হ্যাঁ এখানে একটি বছর রয়েছে 0000. এটির বছর 0 টি বাস্তবায়িত করুন এবং আমাদের একটি বছর -1 এবং একটি বছর -1000 রয়েছে। এই গ্রেগরিয়ান ক্যালেন্ডার বা এই অ্যানো ডোমিনি এবং আরও বিশেষভাবে কখনও দেখেনি গ্রেগরিয়ান ক্যালেন্ডারে এক বছরের শূন্য নয় তবে আইসো রয়েছে এবং আইসো ব্যবহৃত হয়েছে বিজ কম্পিউটারগুলি 0 বছর
বোটেনউউভার

@ সিরিওয়িলিয়াম সেই আকর্ষণীয় যোগ্যতার জন্য আপনাকে ধন্যবাদ। দেখা যাচ্ছে যে ওপি চাইছিল বছর 0 কে নূলে বা এমন কিছু হিসাবে বিবেচনা করা হবে যা বিদ্যমান নেই।
পিটার লরে

1
মাইএসকিউএল 0000-00-00 00:00:00 0 এর সমান leg
জুহা পালোমকি

0

শুধু ক্ষেত্রটিকে চর হিসাবে নিক্ষেপ করুন

উদাহরণস্বরূপ: আপডেট হিসাবে চর হিসাবে কাস্ট (আপডেট)


0

আমি জানি এটি একটি দেরী উত্তর হতে চলেছে, তবে এখানে সবচেয়ে সঠিক উত্তর দেওয়া হচ্ছে।

মাইএসকিউএল ডাটাবেসে আপনার timestampডিফল্ট মানটিকে এতে পরিবর্তন করুন CURRENT_TIMESTAMP। জাল মান সহ আপনার যদি পুরানো রেকর্ড থাকে তবে আপনাকে ম্যানুয়ালি এগুলি ঠিক করতে হবে।


এটি সাহায্য করবে না।
সুনীল শর্মা

0

প্রয়োজনীয় না হলে আপনি mysql টেবিলের কলাম থেকে "নাল নট নয়" সম্পত্তিটি সরিয়ে ফেলতে পারেন। যখন আপনি "নাল নট" সম্পত্তি অপসারণ করেন তখন "0000-00-00 00:00:00" রূপান্তর এবং সমস্যাটি চলে যায়।

কমপক্ষে আমার পক্ষে কাজ করেছেন।


-2

আমার বিশ্বাস, লগস্ট্যাশের মাধ্যমে ডেটা পাম্প করার ক্ষেত্রে ব্যতিক্রমটি এটিকে যারা পাচ্ছেন তার জন্য এটি পূর্ণ সহায়তা Error

উত্তরঃ JDBC: MySQL: // স্থানীয় হোস্ট: 3306 / database_name zeroDateTimeBehavior = convertToNull "

বা যদি আপনি মাইএসকিএল নিয়ে কাজ করছেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.