কীভাবে এসকিউএল সার্ভারে টাইমজোনটি সঠিকভাবে পরিচালনা করবেন?


34

আমার স্থানীয় বিকাশ সার্ভারটি মধ্য প্রাচ্যে রয়েছে তবে আমার প্রোডাকশন সার্ভারটি ইউকেতে রয়েছে।

আমি তাদের সময় অঞ্চলে ব্যবহারকারীর কাছে তারিখটি দেখানো দরকার। উদাহরণস্বরূপ, কোনও ব্যবহারকারী যদি সৌদি আরবে থাকেন তবে আমার সময়টি সৌদি আরবের ফর্ম্যাট অনুসারে দেখানো দরকার।

আমি কি টাইমজোন নামে একটি নতুন ডাটাবেস টেবিল তৈরি করব এবং ইউটিসি-তে সময় সাশ্রয় করব?


কার্যকরভাবে ইউটিসি এবং স্থানীয় (যেমন। পিএসটি) সময়ের মধ্যে এসকিউএল ২০০ http:
mehdi

এটি কি কোনও ওয়েব অ্যাপ্লিকেশন, বা ডেস্কটপ অ্যাপ্লিকেশন, বা ...? এটি কীভাবে বাস্তবায়িত হয় তা ক্লায়েন্ট বিতরণ ব্যবস্থার দ্বারা ব্যাপকভাবে পরিবর্তিত হয়, কারণ আপনার যা প্রয়োজন তা ক্লায়েন্টের পক্ষের উপর নির্ভরশীল।
জন সেগেল

এই ওয়েবের পাশাপাশি দেশীয় মোবাইল। হ্যাঁ এই প্রভাব বিভিন্ন ক্লায়েন্ট বিভিন্নভাবে।
ব্যবহারকারী 960567

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

উত্তর:


48

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

যাইহোক, এটি সঠিকভাবে করলে ট্র্যাক পেতে, এটা সময় অঞ্চল তথ্য সংরক্ষণ অপরিহার্য এর সময়ের সাথে সাথে । অন্য কথায়, নিরূপক যে তারিখ / সময় 20130407 14:50হয় অর্থহীন ছাড়া (ক) সময় অঞ্চল এর সাম্প্রতিক UTC অফসেট সহ (নোট 1) , অথবা (খ) নিশ্চিত সকল যুক্তিকে এইসব মান প্রথম ধর্মান্তরিত ঢোকাতে একটি নির্দিষ্ট সংশোধন অফসেট ( সম্ভবত 0)। এই জিনিসগুলির মধ্যে দুটি ছাড়া, প্রদত্ত দুটি সময়ের মান অপ্রতুল এবং ডেটাটি দূষিত । (পরের পদ্ধতিটি আগুন দিয়ে খেলছে (দ্রষ্টব্য 2) , উপায় হয় না))

এসকিউএল সার্ভার ২০০++ এ আপনি datetimeoffsetডেটা টাইপ ব্যবহার করে সরাসরি সময়ের সাথে অফসেটটি সঞ্চয় করতে পারেন । (সম্পূর্ণতার জন্য, ২০০৫ এবং তার আগে, আমি তত্কালীন ইউটিসি অফসেট মান (মিনিটের মধ্যে) সঞ্চয় করতে একটি দ্বিতীয় কলাম যুক্ত করব))

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

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

আপনি দেখতে পারেন কীভাবে যদি ব্যাক-এন্ড ডেটা সঠিকভাবে সেট আপ না করা হয় তবে খুব তাড়াতাড়ি এটি জটিল এবং হ্যাকি হয়ে যাচ্ছে। আমি path সমস্ত পাথের কোনও নিচে যাওয়ার পরামর্শ দিচ্ছি না কারণ আপনি কেবল আরও সমস্যাটি শেষ করবেন the

নোট 1:

একটি টাইমজোনের ইউটিসি অফসেটটি স্থির নয়: দিবালোকের সঞ্চয়গুলি বিবেচনা করুন যেখানে কোনও জোনটির ইউটিসি অফসেট এক ঘণ্টার চেয়ে কম বা বিয়োগে পরিবর্তিত হয়। এছাড়াও জোনগুলির দিবালোক সঞ্চয় তারিখগুলি নিয়মিতভাবে পরিবর্তিত হয়। সুতরাং datetimeoffset(বা একটি সংমিশ্রণ local timeএবং UTC offset at that time) ব্যবহারের ফলে সর্বাধিক তথ্য পুনরুদ্ধারের ফলাফল।

নোট 2:

এটি ডেটা ইনপুট নিয়ন্ত্রণের বিষয়ে। আগত মানগুলিকে বৈধতা দেওয়ার জন্য কোনও বোকামি-প্রমাণের উপায় নেই তবে, এমন একটি সাধারণ মান প্রয়োগ করা ভাল যা গণনা জড়িত না। যদি কোনও সর্বজনীন এপিআই কোনও অফসেট অন্তর্ভুক্ত এমন কোনও ডেটা ধরণের প্রত্যাশা করে, তবে সেই প্রয়োজনীয়তা কলারের কাছে পরিষ্কার হবে will

যদি এটি না হয়, কলকারীকে ডকুমেন্টেশনের উপর নির্ভর করতে হবে (যদি তারা এটি পড়েন), বা গণনাটি ভুলভাবে করা হয়, ইত্যাদি an অথবা এমনকি এখানে পৃথক সার্ভারে কেবল ওয়েব / ডাটাবেস))

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


3
যেহেতু আমি এটি বুঝতে পারি যে অফসেট টাইমজোনের মতো নয় ... ডেটটাইমসেটে সঞ্চিত সময়গুলি দিবালোকের সঞ্চয় সময় সচেতনতার মতো তথ্য হারাবে ... আরও তথ্য: স্ট্যাকওভারফ্লো
পিটার ম্যাকভয়

1
@ পিটারমাসিভয় ডিএসটির এখানে কোনও প্রাসঙ্গিকতা নেই। datetimeoffsetমানে "জিনিসটি যখন ঘটেছিল তখন এটি ব্যবহারকারী / কম্পিউটারের স্থানীয় সময়" - ডিএসটি কার্যকর ছিল কি না তা আমাদের জানতে হবে না, কারণ প্রদত্ত ইউটিসি অফসেট সর্বদা থাকে ( datetimeoffsetমানের মধ্যে এমবেডেড )।
দাই

12

এসকিউএল সার্ভারে সময় অঞ্চল রূপান্তরকরণের জন্য আমি একটি বিস্তৃত সমাধান তৈরি করেছি। গিটহাবে এসকিউএল সার্ভারের সময় অঞ্চল সমর্থন দেখুন ।

এটি সময় জোনের মধ্যে এবং ইউটিসি থেকে এবং দিনের আলো সংরক্ষণের সময় সহ, রূপান্তরগুলি সঠিকভাবে পরিচালনা করে।

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

ব্যবহারের উদাহরণ (ওপিকে উত্তর দেওয়ার জন্য):

SELECT Tzdb.UtcToLocal(sysutcdatetime(), 'Asia/Riyadh') as CurrentTimeInSaudiArabia

অতিরিক্ত এপিআই এবং বিস্তারিত ব্যাখ্যার জন্য গিটহাবের রিডমি দেখুন ।

এছাড়াও, নোট করুন যেহেতু এটি একটি ইউডিএফ ভিত্তিক সমাধান, তাই এটি প্রাথমিক উদ্দেশ্য হিসাবে কর্মক্ষমতা দিয়ে ডিজাইন করা হয়নি। এটি আরও কার্যকর হবে যদি এই কার্যকারিতাটি এসকিউএল সার্ভারে অন্তর্নির্মিত হয়, একইভাবে CONVERT_TZওরাকল এবং মাইএসকিউএলে ফাংশনটি কীভাবে বিদ্যমান exists


6

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

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

আমি এমন একটি সংস্থায় কাজ করি যেখানে আমাদের কয়েক হাজার সার্ভার রয়েছে (এমএস এসকিউএল সার্ভার নয়, তবে সমস্ত ধরণের সার্ভার) সারা বিশ্বে ছড়িয়ে পড়ে এবং আমরা যদি ইউটিসির মাধ্যমে বিশেষভাবে সমস্ত কিছু বাধ্যতামূলক না করি তবে আমরা সকলেই পাগল হয়ে যাব অত্যন্ত দ্রুত.


5

এসকিউএল সার্ভারে ডেটটাইম এবং টাইমজোন হ্যান্ডলিংয়ের সাথে লড়াই করা যে কোনও ব্যক্তিকে সহায়তা করার জন্য আমি কোডেপ্লেক্সে "টি-এসকিউএল টুলবক্স" প্রকল্পটি বিকাশ ও প্রকাশ করেছি । এটি ওপেন সোর্স এবং ব্যবহারের জন্য সম্পূর্ণ বিনামূল্যে।

এটি বাক্সের বাইরে অতিরিক্ত কনফিগারেশন টেবিলগুলি সহ সহজ প্লে টি-এসকিউএল ব্যবহার করে ডেটটাইম রূপান্তর ইউডিএফ সরবরাহ করে।

আপনার উদাহরণে, আপনি নিম্নলিখিত নমুনা ব্যবহার করতে পারেন:

SELECT [DateTimeUtil].[UDF_ConvertLocalToLocalByTimezoneIdentifier] (
    'GMT Standard Time', -- the original timezone in which your datetime is stored
    'Middle East Standard Time', -- the target timezone for your user
    '2014-03-30 01:55:00' -- the original datetime you want to convert
)

এটি আপনার ব্যবহারকারীর জন্য রূপান্তরিত ডেটটাইম মানটি ফিরিয়ে দেবে।

সমস্ত সমর্থিত টাইমজোনগুলির একটি তালিকা টি-এসকিউএল সরঞ্জামবক্স ডাটাবেসের মধ্যে "ডেটটাইমউটিল.টাইমজোন" সারণিতে পাওয়া যাবে।


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

অ্যান্ড্রি, অবশ্যই, আপনি একটি পারফরম্যান্স দৃষ্টিকোণ থেকে ঠিক। ইউডিএফ-এর ক্যোয়ারী সারণীগুলি গণ ডেটা অপারেশনের জন্য ডিজাইন করা হয়নি, তবে সহজ ব্যবহারের জন্য। তবুও, তারা আমার মেশিনে প্রায় 100.000 রেকর্ড পর্যন্ত বেশ ঠিকঠাক সঞ্চালন করে।
এডেস

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

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

1

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

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