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