তারিখের সময় সন্নিবেশ করার সময় অক্ষর স্ট্রিং থেকে তারিখ এবং / অথবা সময় রূপান্তর করার সময় রূপান্তর ব্যর্থ হয়েছিল


164

আমি নীচে একটি সারণী তৈরি করার চেষ্টা করছিলাম,

create table table1(date1 datetime,date2 datetime);

প্রথমে আমি নীচের মতো মান সন্নিবেশ করানোর চেষ্টা করেছি,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

এটি বলে ত্রুটি দিয়েছে,

বারচারকে ডেটটাইমে রূপান্তর করতে পারে না

তারপরে আমি আমাদের স্ট্যাকওভারফ্লো দ্বারা প্রস্তাবিত পোস্টগুলির একটি হিসাবে নীচে ফর্ম্যাটটির চেষ্টা করেছি,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

তবে তবুও ত্রুটিটি পেয়ে যাচ্ছি,

চরিত্রের স্ট্রিং থেকে তারিখ এবং / অথবা সময় রূপান্তর করার সময় রূপান্তর ব্যর্থ হয়েছিল

কোনও পরামর্শ?


2
যেমন @Damien_The_Unbeliever তুমি বলেছিলে আমি ইতিমধ্যে এই পোস্টে উল্লেখ করা হয়েছে stackoverflow.com/questions/12957635/... এই প্রশ্ন জিজ্ঞাসা করে। তারা আমাদের 'সারণি 1 (অনুমোদনের তারিখ) মানগুলি (রূপান্তর (তারিখের সময়, '18 -06-12 10:34:09 পিএম', 5%)) ব্যবহার করতে বলেছিল; ' তবে এটি কাজ করে না
মারি

উত্তর:


163

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

এটির সমাধানের উপায়টি হ'ল (সামান্য অভিযোজিত) আইএসও -8601 তারিখের ফর্ম্যাটটি যা এসকিউএল সার্ভার দ্বারা সমর্থিত - এই ফর্ম্যাটটি সর্বদা কাজ করে - আপনার এসকিউএল সার্ভার ভাষা এবং তারিখের বিন্যাস নির্বিশেষে।

আইএসও-8601 বিন্যাস SQL সার্ভার দ্বারা সমর্থিত দুই স্বাদে আসে:

  • YYYYMMDDশুধু তারিখের জন্য (কোনও সময় অংশ নেই); এখানে নোট করুন: কোন ড্যাশ! , এটা খুব গুরুত্বপূর্ণ! YYYY-MM-DDহয় না আপনার SQL সার্ভার মধ্যে dateformat সেটিংস স্বাধীন ও হবে না সব পরিস্থিতিতে কাজ!

বা:

  • YYYY-MM-DDTHH:MM:SSতারিখ ও সময় জন্য - নোট এখানে: এই বিন্যাস হয়েছে ড্যাশ (তবে তারা করতে বাদ দেওয়া যেতে), এবং একটি নির্দিষ্ট Tতারিখ এবং আপনার সময় অংশ মধ্যে বিভেদক হিসাবে DATETIME

এটি এসকিউএল সার্ভার 2000 এবং আরও নতুনর জন্য বৈধ।

সুতরাং আপনার কংক্রিট ক্ষেত্রে - এই স্ট্রিংগুলি ব্যবহার করুন:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

এবং আপনার ভাল হওয়া উচিত (দ্রষ্টব্য: এজন্য আপনাকে 12 ঘন্টা-এএম / প্রধানমন্ত্রী বিন্যাসের পরিবর্তে আন্তর্জাতিক 24 ঘন্টা বিন্যাস ব্যবহার করা দরকার )।

বিকল্পভাবে : আপনি যদি এসকিউএল সার্ভার ২০০৮ বা তার থেকেও নতুন হন তবে আপনি DATETIME2ডেটাটাইপও ব্যবহার করতে পারেন (প্লেইনের পরিবর্তে DATETIME) এবং আপনার বর্তমানটি INSERTকোনও সমস্যা ছাড়াই কেবল কাজ করবে! :-) DATETIME2রূপান্তরগুলিতে অনেক ভাল এবং খুব কম পিক - এবং এটি এসকিউএল সার্ভার ২০০৮ এর জন্য তারিখ / সময় ডেটা টাইপ বা যাইহোক নতুনতর।

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

আমাকে কেন জিজ্ঞাসা করবেন না যে এই পুরো বিষয়টি কেন এত জটিল এবং কিছুটা বিভ্রান্তিকর - এটি কেবল এটিই। তবে YYYYMMDDফর্ম্যাটটি সহ, আপনার এসকিউএল সার্ভারের যে কোনও সংস্করণ এবং আপনার এসকিউএল সার্ভারে কোনও ভাষা এবং তারিখের বিন্যাসের জন্য ভাল হওয়া উচিত।


1
ঠিক যেমন নোট, DATETIME2 হিসাবে castালাই 'YYYY-MM-DDTHH: MM: SSZ' (নোট 'জেড' - ইউটিসি টাইমস্ট্যাম্প বোঝাতে জুলু সময়) এর সাথেও কাজ করে। ডেটটাইম ক্ষেত্রে '2013-12-16 টি 17: 21: 26Z' inোকানোর চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি। কেবল পরিষ্কার করার জন্য, আইএসও 8601 আংশিকভাবে সমর্থিত। ডকুমেন্টেশনে উল্লেখ করা সত্ত্বেও এটি জুলু সময়কে সমর্থন করে না। এটি সম্ভবত কিছু সেটিং করার জন্য আমার কাছে সময় বের করার সময় নেই, তবে কারও ক্ষেত্রে একই সমস্যা থাকলে তা মনে রাখবেন।
মিচা

3
আমি নিশ্চিত করতে পারি যে 'ওয়াইওয়াইওয়াইএমএমডিডি' তারিখের ফর্ম্যাটটি দুর্দান্ত কাজ করে, এসকিউএল সার্ভার ২০১৪-তে এটি চেষ্টা করেছিল, যেখানে কোনও শর্তে আক্ষরিক তারিখ নির্দিষ্ট করার উপায় হিসাবে। অনেকগুলি ট্যাঙ্ক @মার্ক_স
জর্জিও বারচিয়েসি

1
DATETIME2 জিনিসটি আমার পক্ষে কাজ করেছে। আমার ক্ষেত্রে আমি একটি এসকিউএল সার্ভার থেকে ইংরেজিতে একটি স্প্যানিশ সংস্করণে একটি ডাটাবেস স্ক্রিপ্ট আমদানি করছিলাম, তাই প্রতিবার একই ত্রুটি। আমি কেবল স্ক্রিপ্টে "DATETIME2 হিসাবে" সমস্ত মুদ্রাকে "DATETIME2 হিসাবে" হিসাবে প্রতিস্থাপন করেছি এবং সমস্যার সমাধান করেছি।
আলেজান্দ্রো দেল রিও

24

এসকিউএল সার্ভারে রূপান্তর কখনও কখনও ব্যবহৃত তারিখ বা সময় ফর্ম্যাটগুলির কারণে ব্যর্থ হয় না, এটি কেবল কারণ আপনি ভুল ডেটা সঞ্চয় করার চেষ্টা করছেন যা সিস্টেমের কাছে গ্রহণযোগ্য নয়।

উদাহরণ:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

এসকিউএল সার্ভারটি নিম্নলিখিত ত্রুটিটি ফেলে দেবে:

Conversion failed when converting date and/or time from character string.

এই ত্রুটির কারণটি হ'ল বছর (2015) তে এ জাতীয় কোনও তারিখ (ফেব্রুয়ারি 29) নেই।


2
"এই ত্রুটির কারণটি হ'ল বছর (2015) এ তেমন কোনও তারিখ (ফেব্রুয়ারি 29) নেই" আমি ঠিক এই কারণেই এই ত্রুটিটি পাচ্ছিলাম। এই উত্তরটি এই ত্রুটির সর্বাধিক সাধারণ কারণটি বিবেচনা করে, অন্য উত্তরগুলি তা করেনি।
ফার্স্টফ্রাক্টাল

1
আমি একটি এক্সেল শীট থেকে ডেটা আমদানি করেছি যেখানে নাল মানগুলিতে প্রকৃতপক্ষে ঘরে "নুল" ছিল। এটি ডিবি টেবিলের স্ট্রিং "নুল" হিসাবে সেট হয়ে গেছে, তাই স্ট্রিং "নুল" কে একটি ডেটটাইমে রূপান্তর করার চেষ্টা করছিল। এক্সেলের "NULL" ঘরটি খালি করা উচিত ছিল। আমি একজন নির্বোধ: /
করোল

17

সহজ উত্তর - 5 হ'ল ইতালিয়ান "yyy" এবং 105 হল ইতালিয়ান "yyyy"। অতএব:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

সঠিকভাবে কাজ করবে, কিন্তু

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

ত্রুটি দেবে।

একইভাবে,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

ত্রুটি দেবে, যেখানে হিসাবে

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

কাজ করবে.


8

বেলোর মতো তারিখের ফর্ম্যাটটি কেবল আপডেট করুন

yyyy-MM-dd hh:MM:ss

এটি আমার জন্য সমস্যাটি সমাধান করে এবং এটি কাজ করে


2
ইতিমধ্যে প্রদত্ত অন্যান্য উত্তরগুলি পড়ুন। এই ফর্ম্যাটটি কেবল আপনার সেশন DATEFORMATসেটিংয়ের কারণে আপনার জন্য কাজ করে। এটি চালিয়ে যাচাই করুন SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);। আপনি কোনও Tবিভাজক ( yyyy-MM-ddTHH:mm:ss) যুক্ত করলে এটি নির্ভরযোগ্যভাবে কাজ করবে ।
ড্যান গুজম্যান

1
অনেক ধন্যবাদ হ্যাঁ আপনি ঠিক বলেছেন এটি আমার সমস্যা সমাধান করে এবং আমি এখানে দেওয়া অন্যান্য উত্তরগুলি পড়ি
প্রণব রায়

8

যখনই সম্ভব সংস্কৃতির নির্দিষ্ট তারিখ / সময় আক্ষরিক এড়ানো উচিত

আক্ষরিক হিসাবে একটি তারিখ / সময় সরবরাহ করার জন্য কিছু সুরক্ষিত ফর্ম্যাট রয়েছে:

সমস্ত উদাহরণ 2016-09-15 17:30:00

ওডিবিসি (আমার প্রিয়, এটি অবিলম্বে আসল ধরণ হিসাবে পরিচালনা করা হয় )

  • {ts'2016-09-15 17:30:00'} - টাইম স্ট্যাম্প
  • {d'2016-09-15'} - শুধুমাত্র তারিখ
  • {t'17:30:00'} - সময় মাত্র

ISO8601 (শ্রেষ্ঠ জন্য সর্বত্র )

  • '2016-09-15T17:30:00'- মাঝখানে সচেতন T!

অপরিবর্তিত (সংখ্যা হিসাবে ভুল ব্যাখ্যা করা ক্ষুদ্র ঝুঁকি)

  • '20160915' - শুধুমাত্র খাঁটি তারিখের জন্য

মনে রাখা ভাল: অবৈধ তারিখগুলি অদ্ভুত ত্রুটিগুলি দেখায়

  • 31 শে জুন বা 30 শে ফেব্রুয়ারী নেই ...

অদ্ভুত রূপান্তর ত্রুটির আরও একটি কারণ: মৃত্যুদণ্ডের আদেশ!

এসকিউএল-সার্ভার কোনওরকম প্রত্যাশিত না হয়ে মৃত্যুদন্ড কার্যকর করার ক্রমে কাজগুলি করতে ভাল জানেন। আপনার লিখিত বিবৃতি দেখে মনে হচ্ছে রূপান্তরটি আগে হয়ে গেছে কিছু ধরণের সম্পর্কিত ক্রিয়া সংঘটিত তবে ইঞ্জিন স্থির করে - কেন কেন - পরবর্তীতে পদক্ষেপে রূপান্তরটি করুক।

এখানে একটি মহান নিবন্ধ উদাহরণ দিয়ে এই ব্যাখ্যা হয় Rusano.com: "টি-SQL-ফাংশন-do-নো-পরোক্ষভাবে-এ-নির্দিষ্ট-অর্ডার অফ সম্পাদন" এবং এখানে হয় সংশ্লিষ্ট প্রশ্ন


3

সর্বোত্তম উপায় হ'ল এই কোড

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
আপনি যদি প্রাথমিক স্পেসগুলির চেয়ে ব্যাকটিকগুলি ব্যবহার করেন তবে আপনি শব্দ-মোড়ানো পাবেন।
জেডে জেসি ডাব্লু - এসই

2

ডেটটাইম ফর্ম্যাটটি যা আসলে এসকিএল সার্ভারে চলে

yyyy-mm-dd hh:MM:ss

1
না, এই (অমিলের ব্যতীত সত্য নয় mএবং M)। প্রোনব রায়ের উত্তরে ড্যান গুজম্যানের মন্তব্য পড়ুন। এবং অন্যান্য উত্তরগুলি এখানে পড়ুন ...
শনুগো

2

এই চেষ্টা করুন।

এসকিউএল সার্ভার এমএম / ডিডি / ওয়াইওয়াই ফর্ম্যাটে তারিখের প্রত্যাশা করে, যদি ইংলিশটি আপনার ডিফল্ট ভাষা হিসাবে সেট করা থাকে e তবে ডেটাপিকারের মানটি স্কুয়েল ২০০৮ ডাটাবেসে সংরক্ষণ করছি M আমার ক্ষেত্রের টাইপটি ডাটাবেসে ডেটটাইম.ডিপিডব আমার ডেটপিকারের নাম।

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

এখন আপনার sertোকানো ক্যোয়ারিতে ডোব ব্যবহার করুন।



1

কনটেটেট করার চেষ্টা করার সময় আমার এই সমস্যাটি ছিল getdate() কোনও এনভারচর ফিল্ডে wasোকাচ্ছিলাম এমন একটি স্ট্রিংয়ের সাথে যুক্ত করে ছিল।

আমি এর কাছাকাছি পেতে কিছু কাস্টিং করেছি:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

এটি একটি স্যানিটাইজড উদাহরণ। এর মূল অংশটি হ'ল:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

তারিখ casted datetime2, তারপর যেমন nvarcharএটা কনক্যাটেনেট করতে।



0

ওয়েবকনফিগ ফাইল থেকে সংস্কৃতি ইংরাজীতে সেট করুন

  <globalization uiCulture="en-US" culture="en-US" />

উদাহরণস্বরূপ আপনি যদি সংস্কৃতি সেট করেন আরবিক থিমটি হবে

22/09/2017 02:16:57 সে

এবং আপনি ত্রুটিটি পান: ডেটটাইম সন্নিবেশ করার সময় অক্ষর স্ট্রিং থেকে তারিখ এবং / অথবা সময় রূপান্তর করার সময় রূপান্তর ব্যর্থ হয়েছিল



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