জেডিবিসিতে DATETIME মানগুলি 0000-00-00 00:00:00 পরিচালনা করা


85

যদি আমি চেষ্টা করি তবে আমি একটি ব্যতিক্রম পাই (নীচে দেখুন)

resultset.getString("add_date");

0000-00-00 00:00:00 (DATETIME এর জন্য আধা-নাল মান) সমেত একটি মাইএসকিউএল ডাটাবেসে জেডিবিসি সংযোগের জন্য, যদিও আমি কেবল স্ট্রিং হিসাবে মান পাওয়ার চেষ্টা করছি, একটি হিসাবে নয় অবজেক্ট

আমি এটা করে প্রায় পেয়েছি

SELECT CAST(add_date AS CHAR) as add_date

যা কাজ করে তবে নির্বোধ বলে মনে হয় ... এটি করার আরও ভাল উপায় আছে কি?

আমার বক্তব্যটি হ'ল আমি কেবল কাঁচা DATETIME স্ট্রিং চাই, তাই আমি এটি নিজের মতো করে পার্স করতে পারি ।

দ্রষ্টব্য: 0000 এখানে আসে যেখানে এখানে: ( http://dev.mysql.com/doc/refman/5.0/en/datetime.html থেকে )

অবৈধ DATETIME, তারিখ, বা TIMESTAMP মানগুলি উপযুক্ত ধরণের ('0000-00-00 00:00:00' বা '0000-00-00') এর "শূন্য" মান রূপান্তরিত হয়।

নির্দিষ্ট ব্যতিক্রমটি হ'ল এটি:

SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
SQLState: S1009
VendorError: 0
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 5 to TIMESTAMP.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.getTimestampFromString(ResultSetImpl.java:6343)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5670)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)

উত্তর:


85

একই সমস্যাটি সমাধান করার চেষ্টা করে আমি হোঁচট খেয়েছি। আমি যে ইন্সটলেশন নিয়ে কাজ করছি তাতে JBOSS এবং হাইবারনেট ব্যবহার করা হয়েছে, তাই আমাকে এটি অন্যভাবে করতে হয়েছিল। মৌলিক ক্ষেত্রে, zeroDateTimeBehavior=convertToNullএই কনফিগারেশন বৈশিষ্ট্য পৃষ্ঠা অনুযায়ী আপনার সংযোগ ইউআরআইতে যুক্ত করতে সক্ষম হওয়া উচিত ।

আপনার হাইবারনেট কনফিগারেশনে সেই প্যারামিটারটি রাখার বিষয়ে আমি জমি জুড়ে অন্যান্য পরামর্শ পেয়েছি:

ইন hibernate.cfg.xml :

<property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>

ইন hibernate.properties :

hibernate.connection.zeroDateTimeBehavior=convertToNull

তবে জেবিএসএস-এর জন্য আমাকে এটি আমার মাইএসকিএল-ডিএস.এক্সএমএল ফাইলটিতে রেখে দিতে হয়েছিল:

<connection-property name="zeroDateTimeBehavior">convertToNull</connection-property>

আশা করি এটি কাউকে সাহায্য করবে। :)


হাইবারনেট
সিএফজি.এক্সএমএল

124

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

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

সম্পাদনা করুন:

সূত্র: মাইএসকিউএল ম্যানুয়াল

সমস্ত শূন্য উপাদান (0000-00-00 ...) সহ তারিখের সময় - জাভাতে এই মানগুলি নির্ভরযোগ্যভাবে উপস্থাপন করা যায় না। কোনও রেজাল্টসেট থেকে পড়ার সময় সংযোজক / জে ..০.x সর্বদা এগুলি NULL এ রূপান্তর করে।

সংযোগকারী / জে 3.1 ডিফল্ট হিসাবে একটি ব্যতিক্রম ছুঁড়ে দেয় যখন এই মানগুলি জেডিবিসি এবং এসকিউএল স্ট্যান্ডার্ড অনুসারে সবচেয়ে সঠিক আচরণ। এই আচরণটি জিরো ডেটটাইমবিহাইভার কনফিগারেশন সম্পত্তি ব্যবহার করে সংশোধন করা যেতে পারে। অনুমোদিত মানগুলি হ'ল:

  • ব্যতিক্রম (ডিফল্ট), যা S1009 এর একটি এসকিউএলস্টেটের সাথে একটি এসকিউএলএক্সসেপশন ছুড়ে দেয়।
  • রূপান্তর করুন , যা তারিখের পরিবর্তে NULL প্রদান করে।
  • গোল , যা নিকটতম নিকটতম মানের যা তারিখকে গোল করে যা 0001-01-01।

আপডেট: আলেকজান্ডার সেই বৈশিষ্ট্যে মাইএসকিএল-সংযোজক -5.1.15-কে প্রভাবিত একটি বাগের কথা জানিয়েছে। অফিসিয়াল ওয়েবসাইটে CHANGELOGS দেখুন ।


মজাদার. আপনি এই তথ্য কোথায় পাবেন?
জেসন এস

সবেমাত্র আমার উত্তর আপডেট! তবে @ এসারামন্টের ইউআরএল এই ক্ষেত্রে আরও ভাল ফিট করতে পারে (এটি সমস্ত সংযোজকের বৈশিষ্ট্য তালিকাভুক্ত করে)।
ব্রায়ান ক্লোজেল

4
jdbc সফ্টওয়্যারটির 5.1.16 সংস্করণটিতে এই বাগফিক্স রয়েছে: - BUG # 57808 এর জন্য স্থির করুন - ডেট ফিল্ডের জন্য সেট করা হয়নি 0000-00-00 মান getDate () তে যদিও শূন্যদ্বীপটাইমবিভাভিয়ার রূপান্তরযোগ্যনুলক হয়।
আলেকজান্ডার কেজেল

কি দারুন! তথ্যের জন্য ধন্যবাদ। আমি অনুমান করি যে আপনি এটি বুঝতে খুব কঠিন সময়
কাটিয়েছিলেন

11

আমার বক্তব্যটি হ'ল আমি কেবল কাঁচা DATETIME স্ট্রিং চাই, তাই আমি এটি নিজের মতো করে পার্স করতে পারি।

এটি আমাকে ভাবতে বাধ্য করে যে আপনার "ওয়ার্কআরাউন্ড" কোনও কার্যকার্য নয়, তবে বাস্তবে আপনার কোডে ডাটাবেস থেকে মান পাওয়ার একমাত্র উপায়:

SELECT CAST(add_date AS CHAR) as add_date

যাইহোক, মাইএসকিউএল ডকুমেন্টেশন থেকে আরও কিছু নোট:

অবৈধ ডেটাতে মাইএসকিউএল সীমাবদ্ধতা :

মাইএসকিউএল 5.0.2 এর আগে, মাইএসকিউএল অবৈধ বা অনুপযুক্ত ডেটা মানগুলিকে ক্ষমা করছে এবং ডেটা প্রবেশের জন্য আইনি মানগুলিতে জোর করে। মাইএসকিউএল ৫.০.২ এবং তারপরেও এটি পূর্বনির্ধারিত আচরণ থেকে যায় তবে খারাপ মানগুলির আরও traditionalতিহ্যবাহী চিকিত্সা নির্বাচন করতে আপনি সার্ভার এসকিউএল মোড পরিবর্তন করতে পারেন যাতে সার্ভার তাদের প্রত্যাখ্যান করে এবং বিবৃতিটি বাতিল করে যেখানে তারা ঘটে।

[..]

আপনি যদি NULL মানগুলিতে নেয় না এমন কলামে NULL সঞ্চয় করার চেষ্টা করেন, তবে একক-সারি INSERT বিবৃতিতে ত্রুটি ঘটে। একাধিক সারি INSERT বিবৃতি বা INSERT INTO এর জন্য ... নির্বাচনী বিবরণী নির্বাচন করুন, মাইএসকিউএল সার্ভার কলামের ডেটা টাইপের জন্য অন্তর্ভুক্ত ডিফল্ট মান সঞ্চয় করে।

মাইএসকিউএল 5.x তারিখ এবং সময় প্রকার :

মাইএসকিউএল আপনাকে '0000-00-00' কে "ডামি তারিখ" হিসাবে সংরক্ষণ করতে দেয় (আপনি যদি NO_ZERO_DATE এসকিউএল মোড ব্যবহার না করেন)। এটি কিছু ক্ষেত্রে NULL মান ব্যবহারের চেয়ে বেশি সুবিধাজনক (এবং কম ডেটা এবং সূচী স্থান ব্যবহার করে) is

[..]

ডিফল্টরূপে, যখন মাইএসকিউএল কোনও তারিখ বা সময়ের ধরণের মানের মুখোমুখি হয় যা সীমার বাইরে বা অন্যথায় প্রকারের জন্য অবৈধ (এই বিভাগের শুরুতে বর্ণিত) এই জাতীয় মানটিকে সেই ধরণের জন্য "শূন্য" মানে রূপান্তর করে।


6
DATE_FORMAT(column name, '%Y-%m-%d %T') as dtime

ত্রুটি এড়াতে এটি ব্যবহার করুন। এটি স্ট্রিং ফর্ম্যাটে তারিখটি ফেরত দেয় এবং তারপরে আপনি স্ট্রিং হিসাবে এটি পেতে পারেন।

resultset.getString("dtime");

এটি আসলে কাজ করে না। যদিও আপনি getString কল। অভ্যন্তরীণভাবে mysql এখনও এটিকে প্রথমে তারিখে রূপান্তরিত করার চেষ্টা করে।

com।

~ [mysql- সংযোজক-জাভা -5.1.15.jar: না] এ com.mysql.jdbc.ResultSetImpl.getStringIntern (রেজাল্টসেটআইএমপিএল.জাভা 55743)

~ [mysql- সংযোজক-জাভা -5.1.15.jar: না] এ com.mysql.jdbc.ResultSetImpl.getString (ফলাফলসেটআইম্পল.জভা.৫7676))

~ [মাইএসকিএল-সংযোজক-জাভা -৫.১.১৫.জার: না]


4
এটি আমার CAST (CHAR হিসাবে অ্যাড_ডেট) সমাধানের মতোই, তবে +1 যেহেতু এটি আপনাকে এটি যেভাবে চান তা স্পষ্টভাবে ফর্ম্যাট করতে দেয়।
জেসন এস

5

যদি, লাইন যুক্ত করার পরে:

<property
name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>

hibernate.connection.zeroDateTimeBehavior=convertToNull

<connection-property
name="zeroDateTimeBehavior">convertToNull</connection-property>

ত্রুটি হতে থাকে:

Illegal DATETIME, DATE, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00 00:00:00' or '0000-00-00').

লাইনগুলি সন্ধান করুন:

1) resultSet.getTime("time"); // time = 00:00:00
2) resultSet.getTimestamp("timestamp"); // timestamp = 00000000000000
3) resultSet.getDate("date"); // date = 0000-00-00 00:00:00

নিম্নলিখিত লাইনগুলি যথাক্রমে প্রতিস্থাপন করুন:

1) Time.valueOf(resultSet.getString("time"));
2) Timestamp.valueOf(resultSet.getString("timestamp"));
3) Date.valueOf(resultSet.getString("date"));

5

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

SET বর্গক্ষেত্র_মোড = 'NO_ZERO_DATE';

আমি এটি আমার টেবিলের বিবরণে রেখেছি এবং এটি '0000-00-00 00:00:00' এর সমস্যার সমাধান করে java.sql.Timestamp হিসাবে উপস্থাপন করা যায় না


3

আমি আপনাকে নাল মানটি উপস্থাপন করতে নাল ব্যবহার করার পরামর্শ দিচ্ছি।

আপনি কি ব্যতিক্রম পাবেন?

বিটিডাব্লু:

0 বা 0000 নামক কোনও বছর নেই ((যদিও কিছু তারিখ এই বছর অনুমতি দেয়)

এবং বছরের 0 মাস বা মাসের 0 দিন হয় না। (যা আপনার সমস্যার কারণ হতে পারে)


হ্যাঁ, তবে এখনও 0 বলে কোনও বছর নেই, এমনকি পূর্বপরিকল্পিতভাবে। 1 এডি / সিই এর আগের বছরটি ছিল 1 বিসি / বিসিই
পিটার ল্যারি

4
মাইএসকিউএল 0000 একটি অবৈধ তারিখ হিসাবে ব্যবহারের পুরো কারণ, কারণ এটি বিদ্যমান তারিখগুলির সাথে বিরোধ করে না। এছাড়াও, 1999-00-00 এর মতো তারিখগুলি কখনও কখনও নির্দিষ্ট দিনের চেয়ে 1999 সালটি উপস্থাপন করতে ব্যবহৃত হয় (আমার দ্বারা নয়!)।
জেসন এস

3

'00 -00 -.... 'বিবেচনা করে আমি সমস্যার সমাধান করেছি কোনও বৈধ তারিখ নয়, তারপরে, আমি আমার এসকিউএল কলাম সংজ্ঞা পরিবর্তন করেছি নাল মানগুলিতে অনুমতি দেওয়ার জন্য "NULL" এক্সপ্রেশন যুক্ত করে:

SELECT "-- Tabla item_pedido";
CREATE TABLE item_pedido (
    id INTEGER AUTO_INCREMENT PRIMARY KEY,
    id_pedido INTEGER,
    id_item_carta INTEGER,
    observacion VARCHAR(64),
    fecha_estimada TIMESTAMP,
    fecha_entrega TIMESTAMP NULL, // HERE IS!!.. NULL = DELIVERY DATE NOT SET YET
    CONSTRAINT fk_item_pedido_id_pedido FOREIGN KEY (id_pedido)
        REFERENCES pedido(id),...

তারপরে, আমি নুল মান সন্নিবেশ করতে সক্ষম হব, এর অর্থ "আমি এখনও এই টাইমস্ট্যাম্পটি নিবন্ধন করিনি" ...

SELECT "++ INSERT item_pedido";
INSERT INTO item_pedido VALUES
(01, 01, 01, 'Ninguna', ADDDATE(@HOY, INTERVAL 5 MINUTE), NULL),
(02, 01, 02, 'Ninguna', ADDDATE(@HOY, INTERVAL 3 MINUTE), NULL),...

টেবিল চেহারা যে:

mysql> select * from item_pedido;
+----+-----------+---------------+-------------+---------------------+---------------------+
| id | id_pedido | id_item_carta | observacion | fecha_estimada      | fecha_entrega       |
+----+-----------+---------------+-------------+---------------------+---------------------+
|  1 |         1 |             1 | Ninguna     | 2013-05-19 15:09:48 | NULL                |
|  2 |         1 |             2 | Ninguna     | 2013-05-19 15:07:48 | NULL                |
|  3 |         1 |             3 | Ninguna     | 2013-05-19 15:24:48 | NULL                |
|  4 |         1 |             6 | Ninguna     | 2013-05-19 15:06:48 | NULL                |
|  5 |         2 |             4 | Suave       | 2013-05-19 15:07:48 | 2013-05-19 15:09:48 |
|  6 |         2 |             5 | Seco        | 2013-05-19 15:07:48 | 2013-05-19 15:12:48 |
|  7 |         3 |             5 | Con Mayo    | 2013-05-19 14:54:48 | NULL                |
|  8 |         3 |             6 | Bilz        | 2013-05-19 14:57:48 | NULL                |
+----+-----------+---------------+-------------+---------------------+---------------------+
8 rows in set (0.00 sec)

শেষ অবধি: জেপিএ পদক্ষেপে:

@Stateless
@LocalBean
public class PedidosServices {
    @PersistenceContext(unitName="vagonpubPU")
    private EntityManager em;

    private Logger log = Logger.getLogger(PedidosServices.class.getName());

    @SuppressWarnings("unchecked")
    public List<ItemPedido> obtenerPedidosRetrasados() {
        log.info("Obteniendo listado de pedidos retrasados");
        Query qry = em.createQuery("SELECT ip FROM ItemPedido ip, Pedido p WHERE" +
                " ip.fechaEntrega=NULL" +
                " AND ip.idPedido=p.id" +
                " AND ip.fechaEstimada < :arg3" +
                " AND (p.idTipoEstado=:arg0 OR p.idTipoEstado=:arg1 OR p.idTipoEstado=:arg2)");
        qry.setParameter("arg0", Tipo.ESTADO_BOUCHER_ESPERA_PAGO);
        qry.setParameter("arg1", Tipo.ESTADO_BOUCHER_EN_SERVICIO);
        qry.setParameter("arg2", Tipo.ESTADO_BOUCHER_RECIBIDO);
        qry.setParameter("arg3", new Date());

        return qry.getResultList();
    }

সবশেষে এর সমস্ত কাজ। আমি আশা করি যে আপনি সাহায্য করবে।


আমি মনে করি না যে এটি সমস্ত শূন্যের একটি মাইএসকিউএল ডেটটাইমকে একটি বৈধ তারিখে রূপান্তরিত করার সমস্যার সমাধান করে। এটি কেবল দেখায় যে কীভাবে একটি ডেটটাইম ক্ষেত্রের শূন্যস্থান প্রবেশ করতে হয় যা আসলে খুব বেশি সাহায্য করে না।
মার্ক চর্লে

2

অন্যান্য উত্তরে যুক্ত করতে: আপনি যদি 0000-00-00স্ট্রিংটি চান তবে আপনি ব্যবহার করতে পারেন noDatetimeStringSync=true(টাইমজোন রূপান্তর ত্যাগের সতর্কতার সাথে)।

অফিসিয়াল মাইএসকিউএল বাগ: https://bugs.mysql.com/bug.php?id=47108

এছাড়াও, ইতিহাসের জন্য, জেডিবিসি তারিখগুলির NULLজন্য ফিরে 0000-00-00আসত তবে এখন ডিফল্টরূপে একটি ব্যতিক্রম ফিরে আসে। উৎস


2

আপনি jdbc url এর সাথে যুক্ত করতে পারেন

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

এর সাহায্যে, এসকিউএল '0000-00-00 00:00:00' নাল মান হিসাবে রূপান্তর করে।

যেমন:

jdbc:mysql:<host-name>/<db-name>?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.