কোন তারিখ / সময়ের আক্ষরিক ফর্ম্যাটগুলি ভাষা এবং DATEFORMAT নিরাপদ?


24

এটি সহজেই প্রমাণ করা যায় যে নীচের দুটি ব্যতীত অন্যান্য অনেক তারিখ / সময় ফর্ম্যাটগুলি সেট ভাষা, সেট তারিখ-ভাষা, বা লগইনের ডিফল্ট ভাষার কারণে ভুল ব্যাখ্যা করতে পারে:

yyyyMMdd                 -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff  -- date dash separated, date/time separated by T 

এমনকি এই বিন্যাস, টি ছাড়াই পারে চেহারা একটি বৈধ ISO 8601 বিন্যাস মত, কিন্তু এটা অনেকগুলি ভাষায় ব্যর্থ হলে:

DECLARE @d varchar(32) = '2017-03-13 23:22:21.020';

SET LANGUAGE Deutsch;
SELECT CONVERT(datetime, @d);

SET LANGUAGE Français;
SELECT CONVERT(datetime, @d);

ফলাফল:

ডাই স্প্রেচেনইনস্টেলুং ওয়ার্ড আউফ ডয়চে গ্যানডার্ট।

এমএসজি 242, স্তর 16, রাজ্য 3
বেই ডার কনভার্টিওং ইইনস তারিখ-ডেটেন্টাইপ লেগট্ট ডের ওয়ার্ট আউয়ারহালব ডেস গ্লটিজেন বেরেকস-এ বৈরচার-ডেটেন্টিপগুলি।

লে পেরামিট্রে দে ল্যাঙ্গুয়েস্ট পাসের à ফ্রান্সেস।

এমএসজি 242, স্তর 16, রাজ্য 3
লা রূপান্তর ডান ধরণের ধরণের রূপান্তর দিন টাইপ করার জন্য ডেটনেস তারিখের সময়সীমা নয় lim

এখন, এগুলি ব্যর্থ হয়েছে যেন ইংরেজিতে, আমি একটি মাসের দিন নির্ধারণ করতে মাস এবং দিন স্থানান্তরিত করেছি yyyy-dd-mm:

DECLARE @d varchar(32) = '2017-13-03 23:22:21.020';

SET LANGUAGE us_english;
SELECT CONVERT(datetime, @d);

ফলাফল:

এমএসজি 242, স্তর 16, রাজ্য 3
একটি বারচার ডেটা টাইপকে একটি ডেটটাইম ডেটা টাইপের রূপান্তরকরণের ফলে সীমার মান ছাড়িয়ে যায়।

(এটি মাইক্রোসফ্ট অ্যাক্সেস নয়, যা আপনার কাছে "দুর্দান্ত" এবং আপনার জন্য স্থানান্তরকে সংশোধন করে, এছাড়াও, কিছু ক্ষেত্রে একইরকম ত্রুটি ঘটতে পারে SET DATEFORMAT ydm;- এটি কেবল একটি ভাষার জিনিস নয়, এটি আরও সাধারণ পরিস্থিতি যেখানে এইগুলি ভাঙ্গন ঘটে - এবং সর্বদা লক্ষ্য করা যায় না কারণ কখনও কখনও এগুলি ত্রুটি হয় না, এটি ঠিক 7th ই আগস্ট 8 ই জুলাই হয়ে গেছে এবং কেউ তা খেয়াল করেনি।)

সুতরাং, প্রশ্ন:

এখন আমি জানি যে অনিরাপদ ফর্ম্যাটগুলির একটি গুচ্ছ রয়েছে, অন্য কোনও ফর্ম্যাট রয়েছে যে কোনও ভাষা এবং ডেটফর্ম্যাট সংমিশ্রণটি নিরাপদে থাকবে?

উত্তর:


26

ইন ডকুমেন্টেশন , এটা খুবই স্পষ্টভাবে বর্ণিত আছে যে শুধুমাত্র নিরাপদ ফরম্যাটের বেশী আমি প্রশ্ন খুব প্রারম্ভে প্রদর্শিত আছেন:

yyyyMMdd                 -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff  -- date dash separated, date/time separated by T 

যাইহোক, এটি সম্প্রতি আমার নজরে এনেছে যে একটি তৃতীয় ফর্ম্যাট রয়েছে যা কোনও ভাষা বা তারিখের ফর্ম্যাট সেটিংসের জন্য সমানভাবে প্রতিরোধক:

yyyyMMdd hh:mm:ss.fff    -- unseparated date, no T separator

টিএল; ডিআর: এটি সত্য। জন্য datetimeএবং smalldatetime

দীর্ঘ সংস্করণ পড়ুন এবং আপনি যতটা প্রমাণ পেতে চলেছেন সে সম্পর্কে পড়ুন।


এখানে একটি ফাঁক রয়েছে যা এটি ব্যাখ্যা করে - মূল পাঠ্য সংস্থার yyyyMMdd hh:...স্থানান্তরিত ভাষা বা তারিখ বিন্যাসের ব্যাখ্যা থেকে নিরাপদ একটি ফর্ম্যাট হিসাবে স্বীকৃতি দিতে ব্যর্থ হওয়ার সাথে সাথে একটি সামান্য ধোঁয়া আছে যে বলে যে স্ট্রিমের তারিখের অংশটি ডেট ফর্ম্যাট সেটিংসের উপর নির্ভর করে বৈধ নয়:

এখানে চিত্র বর্ণনা লিখুন

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

সুতরাং আমি প্রমাণ করেছি যে ভাষা / তারিখের বিন্যাসের কোনও সংমিশ্রণ এই নির্দিষ্ট বিন্যাসটিকে ব্যর্থ করতে পারে না।

প্রথমত, আমি প্রতিটি ভাষার জন্য গতিশীল এসকিউএল এর একটি সামান্য ব্লক তৈরি করেছি:

EXEC sys.sp_executesql @sql, N'@lang sysname', N'us_english';

এটি 34 টি সারি আউটপুট এর উত্পাদন করে:

EXEC sys.sp_executesql @sql, N'@lang sysname', N'us_english';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Deutsch';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Français';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'日本語';
...
EXEC sys.sp_executesql @sql, N'@lang sysname', N'简体中文';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'Arabic';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'ไทย';
EXEC sys.sp_executesql @sql, N'@lang sysname', N'norsk (bokmål)';    

আমি সেই আউটপুটটিকে একটি নতুন ক্যোয়ারী উইন্ডোতে অনুলিপি করেছি এবং তার উপরে, আমি এই কোডটি তৈরি করেছি, যা আশাবাদী যে একই তারিখটি (মার্চের ১৩ তারিখ) কমপক্ষে একটি ক্ষেত্রে 13 তম মাসের তৃতীয় দিনে রূপান্তরিত করার চেষ্টা করবে:

DECLARE @sql nvarchar(max) = N'
SET LANGUAGE @lang;
SET DATEFORMAT ydm;
SELECT @@LANGUAGE, CONVERT(datetime, ''20170313 23:22:21.020'');';

নাহ, প্রতিটি ভাষা ঠিক সন্ধান করতে কাজ করেছে ydm। আমি প্রতিটি অন্যান্য ফর্ম্যাটও চেষ্টা করেছি এবং প্রতিটি তারিখ / সময় ডেটা টাইপ করেছি। প্রতিবার 13 শে মার্চ 34 টি সফল রূপান্তর।

সুতরাং, আমি @AndriyM এবং @ এরিককে সম্মতি জানাই যে, সত্যই, একটি তৃতীয় নিরাপদ বিন্যাস রয়েছে। আমি ভবিষ্যতের পোস্টগুলির জন্য এটি মাথায় রাখব, তবে আমি অন্য দুটি জায়গায় ড্রামগুলি এত জায়গায় ঠাপিয়েছি, আমি সেগুলি সব খুঁজে নিব এবং এখনই তাদের সংশোধন করব না।


এক্সটেনশন দ্বারা, আপনি ভাবেন যে এটি নিরাপদ হবে, তবে তা নয়:

yyyyMMddThh:mm:ss.fff    -- unseparated date, T separator

আমি প্রতিটি ভাষায় মনে করি, এটি এর সমতুল্য হবে:

Msg 241, স্তর 16, রাজ্য 1, লাইন 8
রূপান্তর ব্যর্থ হয়েছে যখন তারিখ এবং / অথবা অক্ষর স্ট্রিং থেকে সময় রূপান্তরিত হয়েছিল।


সম্পূর্ণতার জন্য, একটি চতুর্থ নিরাপদ বিন্যাস, কিন্তু এটা নতুন তারিখ / সময় প্রকারের রূপান্তরের জন্য শুধুমাত্র নিরাপদ ( date, datetime2, datetimeoffset)। এই ক্ষেত্রে ভাষার সেটিংস হস্তক্ষেপ করতে পারে না:

yyyy-MM-dd hh:mm:...

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

SET LANGUAGE Deutsch;
DECLARE @dashes char(10) = '2017-03-07 03:34';
DECLARE @d date = @dashes, @dt datetime = @dashes, @dt2 datetime2 = @dashes;

SELECT DATENAME(MONTH,@d), DATENAME(MONTH,@dt), DATENAME(MONTH,@dt2);

এমনকি একই উত্সের স্ট্রিং দেওয়া হলেও রূপান্তরগুলি বেশ আলাদা ফলাফল পেয়েছিল:

März    Juli    März

বিন্যাসে DATETIME (জন্য কাজ করে yyyyMMdd) হবে এছাড়াও সবসময় তারিখ এবং অন্যান্য নতুন ধরনের জন্য কাজ করি। সুতরাং, আইএমএইচও, কেবল সর্বদা এটি ব্যবহার করুন। এবং তারিখ / সময় ( yyyyMMdd hh:...) সহ প্রকারের জন্য তৃতীয় ফর্ম্যাটটি দেওয়া হয়েছে , এটি আসলে আপনাকে আরও সুসংগত হতে দেবে - এমনকি তারিখের উপাদানটি সর্বদা কিছুটা কম পাঠযোগ্য।


এখন যখন আমি তারিখের স্ট্রিং প্রতিনিধিত্বের কথা বলছি তখন তিনটি নিরাপদ ফর্ম্যাট প্রদর্শনের অভ্যাসে উঠতে আমাকে কয়েক বছর সময় দিতে, দিতে বা নিতে হবে ।


ভবিষ্যতের কোন প্রকাশে এসকিউএল সার্ভারে একটি নতুন ভাষা যুক্ত করা হলে তৃতীয় ফর্ম্যাটটি অনিরাপদ হয়ে যেতে পারে ?
কুবা ওয়াইরোস্টেক

@ কুবা আমি যথেষ্ট আত্মবিশ্বাসী যে মাইক্রোসফ্ট এ সম্পর্কে তাদের পাঠ শিখেছে। এই ভাষাগুলির সমস্তটি yYYY-DD-MM- এর অর্থ ব্যাখ্যা করার জন্য কেউ খুব খারাপ সিদ্ধান্ত নিয়েছে, এমন একটি ফর্ম্যাট যা আমি মনে করি না যে পৃথিবীর কেউ কখনও উদ্দেশ্য নিয়ে ব্যবহার করেছে।
অ্যারন বারট্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.