ডেটটাইম সংরক্ষণ করার পছন্দের উপায়


18

আমরা তারিখ এবং সময় সম্পর্কিত তথ্য কয়েকটি উপায়ে সংরক্ষণ করতে পারি। ডেটটাইম তথ্য সংরক্ষণের জন্য সর্বোত্তম পন্থা কোনটি?

ডেটটাইম ব্যবহার করে 2 টি পৃথক কলাম বা একটি কলামে তারিখ এবং সময় সংরক্ষণ করছেন ?

কেন আপনি এই পদ্ধতিটি আরও ভাল তা ব্যাখ্যা করতে পারেন?

(রেফারেন্সের জন্য মাইএসকিউএল ডক্সের সাথে লিঙ্ক করুন, প্রশ্নটি সাধারণ, মাইএসকিউএলের সাথে নির্দিষ্ট নয়)
তারিখ এবং সময় প্রকার: তারিখ এবং সময়


3
এটি মূলত আপনি কোন ডাটাবেস সিস্টেমটি ব্যবহার করছেন তার উপর নির্ভর করে। যার মূল্য রয়েছে তার জন্য: ওরাকল এটির জন্য একটি কলাম (একটি ডেটটাইম ডেটাটাইপ হিসাবে) হিসাবে বেছে নিয়েছিল, সেক্ষেত্রে তাদের অন্তর্নির্মিত সমর্থন ব্যবহার করে অবশ্যই এই তথ্যটি 2 টি কলামে NUMBER ডেটাটাইপ হিসাবে সংরক্ষণ করার চেয়ে সেরা হতে চলেছে (এমনকি যদি আপনি কেবলমাত্র প্রদত্ত ক্যোয়ারির জন্য 1 অংশ প্রয়োজন ... তারিখ বা সময়)।
ক্রিস জনস্টন

5
এসকিউএল সার্ভারের ক্ষেত্রে এমন একটি ক্ষেত্রে তারিখ অনুসারে গ্রুপিংয়ের জন্য পৃথকীকরণের পক্ষে পছন্দ করা যায়। একটি স্ট্রীম সমষ্টিগত উপর যৌগিক সূচির জন্য কেমন ছাড়া ব্যবহার করা সক্ষম হবে date,time সঙ্গে group by dateকিন্তু একটি সূচির জন্য না datetime সঙ্গে group by cast(datetime as date)যদিও এটি কাঙ্ক্ষিত অর্ডার সরবরাহ করা হবে।
মার্টিন স্মিথ

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

উত্তর:


23

একক কলামে ডেটা সংরক্ষণ করা পছন্দের উপায়, যেহেতু তারা অবিচ্ছেদ্যভাবে সংযুক্ত রয়েছে। সময়ের একটি বিন্দু হ'ল তথ্য নয়, দুটি নয়।

অনেক পণ্য দ্বারা "পর্দার পিছনে" নিয়োগের তারিখ / সময় তথ্য সংরক্ষণের একটি সাধারণ উপায় হ'ল এটি একটি দশমিক মানকে রূপান্তর করা যেখানে "তারিখ" দশমিক মানের পূর্ণসংখ্যার অংশ এবং "সময়" হয় ভগ্নাংশ মান। সুতরাং, 1900-01-01 00:00:00 0.0 এবং সেপ্টেম্বর 20, 2016 9:34:00 হিসাবে 42631.39861 হিসাবে সংরক্ষণ করা হয়। 42001 1900-01-01 থেকে দিনের সংখ্যা। .39861 মধ্যরাত থেকে কেটে যাওয়া সময়ের অংশ। এটি করতে সরাসরি দশমিক প্রকার ব্যবহার করবেন না, একটি সুস্পষ্ট তারিখ / সময় প্রকার ব্যবহার করুন; আমার বক্তব্য এখানে একটি উদাহরণ মাত্র।

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

আপনি যদি মানগুলি আলাদাভাবে সঞ্চয় করেন তবে আপনি অনায়াসে "বাগগুলি" এ চালাবেন যা সনাক্ত করা কঠিন। উদাহরণস্বরূপ নিন:

IF OBJECT_ID('tempdb..#DT') IS NOT NULL
DROP TABLE #DT;
CREATE TABLE #DT
(
    dt_value DATETIME NOT NULL
    , d_value DATE NOT NULL
    , t_value TIME(0) NOT NULL
);


DECLARE @d DATETIME = '2016-09-20 09:34:00';

INSERT INTO #DT (dt_value, d_value, t_value)
SELECT @d, CONVERT(DATE, @d), CONVERT(TIME(0), @d);

SET @d = '2016-09-20 11:34:00';

INSERT INTO #DT (dt_value, d_value, t_value)
SELECT @d, CONVERT(DATE, @d), CONVERT(TIME(0), @d);

/* show all rows with a date after 2016-07-01 11:00 am */
SELECT *
FROM #DT dt
WHERE dt.dt_value >= '2016-07-01 11:00:00';

/* show all rows with a date after 2016-07-01 11:00 am */
SELECT *
FROM #DT dt
WHERE dt.d_value >= CONVERT(DATE, '2016-07-01')
    AND dt.t_value >= CONVERT(TIME(0), '11:00:00');

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

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

একটি তারিখ / সময় পরিসীমা ফিল্টার করার সঠিক উপায় যেখানে মানগুলি পৃথক কলামে রয়েছে, যেমন মন্তব্যগুলিতে @ সাইপারকিউব দ্বারা নির্দেশিত হয়েছে:

WHERE dt.d_value > CONVERT(DATE, '2016-07-01') /* note there is no time component here */
    OR (
        dt.d_value = CONVERT(DATE, '2016-07-01') 
        AND dt.t_value >= CONVERT(TIME(0), '11:00:00')
    )

আপনার যদি বিশ্লেষণের উদ্দেশ্যে পৃথক সময়ের উপাদান প্রয়োজন হয় তবে আপনি মানটির সময় অংশের জন্য গণনা করা, অবিরত, কলাম যুক্ত করতে বিবেচনা করতে পারেন:

ALTER TABLE #DT
ADD dt_value_time AS CONVERT(TIME(0), dt_value) PERSISTED;

SELECT *
FROM #dt;

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

অবিরাম কলামটি দিনের বেলা অনুসারে দ্রুত প্রকারের ইত্যাদির জন্য অনুমতি দিয়ে সূচিযুক্ত করা যেতে পারে।

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


11

আমি অন্যান্য উত্তরের একটি ভিন্ন মতামত প্রদান করতে যাচ্ছি।

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

তবে, এটির ক্ষেত্রেও হতে পারে যে একটি বা উভয় উপাদান পৃথকভাবে alচ্ছিক। সেক্ষেত্রে এটি একটি একক কলামে সংরক্ষণ করা ভুল হবে। এটি করার ফলে আপনি ন্যূনতম মানগুলিকে একটি স্বেচ্ছাসেবী উপায়ে উপস্থাপন করতে বাধ্য করবেন যেমন সময়কে 00:00:00 হিসাবে সংরক্ষণ করা।

এখানে উদাহরণ তুলে ধরা হলো:

  • মাইলেজ ট্যাক্স ছাড়ের জন্য আপনি যানবাহনের ভ্রমণ রেকর্ড করছেন। ভ্রমণের সঠিক সময়টি জানা কার্যকর হবে তবে কোনও কর্মচারী যদি এটি নোট না করে এবং ভুলে যায় তবে তারিখটি এখনও নিজেই রেকর্ড করা উচিত (প্রয়োজনীয় তারিখ, alচ্ছিক সময়)।

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

বিকল্প পদ্ধতির জন্য এই সম্পর্কিত প্রশ্নটি দেখুন ।


ইন বোঝায় যা RFC 3339 রেকর্ডিং জন্য একটি কনভেনশন "অজানা স্থানীয় অফসেট" নেই। আমি মনে করি না এটি "অজানা সময়" এর ব্যবহারের ক্ষেত্রে যথেষ্ট কভার করে তবে এটি খুব কাছে। পরবর্তী বিভাগ "অযোগ্য স্থানীয় সময়" আরও কাছাকাছি, কিন্তু আবার এটি যথেষ্ট পর্যাপ্ত নয়।
জেনোরোমা

হ্যাঁ, আমি এই মুহুর্তে আমার স্কিমাটি রিফ্যাক্টরিংয়ের ব্যারেলটি সরিয়ে আছি। গাড়ি ভাড়া নেওয়ার পরিস্থিতি নিন। কোনও ভাড়া সংস্থার কাছ থেকে গাড়ি বাছতে - সংস্থাকে খোলা রাখা দরকার; সুতরাং আপনি পিকআপের জন্য একটি তারিখ এবং সময় নির্দিষ্ট করে দিন। তবে অনেকের কি-বোর্ড বাক্স রয়েছে; তাই আপনি কয়েক ঘন্টা পরে ছেড়ে দিন। সুতরাং যদি রবিবারে অবস্থানটি বন্ধ থাকে; একটি ড্রপ-অফ তারিখ আছে; কিন্তু একটি সময় নয়। একটি 0 মান (উদাহরণস্বরূপ 12am) সংরক্ষণ করা কাজ করবে না কারণ কিছু অবস্থান মধ্যরাত অবধি খোলা থাকে, যা অন্যান্য পরিস্থিতিতে একটি কার্যকর মূল্য is
রিস করুন

5

নির্দিষ্ট কিছু ব্যবসা / আবেদনের চাহিদা না থাকলে আমি সর্বদা এটি একক কলাম হিসাবে সংরক্ষণ করতে পছন্দ করব। নীচে আমার পয়েন্টগুলি হল -

  • টাইমস্ট্যাম্প থেকে সময় উত্তোলন কোনও সমস্যা নয়
  • আমরা যদি উভয়কে একসাথে সঞ্চয় করতে পারি তবে কেন সময়ের জন্য অতিরিক্ত কলাম যুক্ত করা যায়
  • আপনি যখনই জিজ্ঞাসা করছেন প্রতিবার তারিখ এবং সময় যুক্ত এড়াতে।

1
@a_horse_with_no_name এর এখানে একটি পয়েন্ট রয়েছে। আমি মনে করি "ডেটটাইমস্ট্যাম্প থেকে টাইমস্ট্যাম্প উত্তোলন কোনও সমস্যা নয়" "পুনরায় সংশোধন করা উচিত কারণ " টাইমস্ট্যাম্প থেকে সময় উত্তোলন কোনও সমস্যা নয় " । "টাইমস্ট্যাম্প" এর অর্থ সাধারণত তারিখ এবং সময় উভয়ই হয় (এবং সাধারণত টাইমজোন)।
ypercubeᵀᴹ

হ্যাঁ, @ ypercubeᵀᴹ এ সম্মত হন ᵀᴹ টাইমস্ট্যাম্প সাধারণত তারিখ এবং সময় উভয়ই বোঝায়। আমি ডেটটাইমস্ট্যাম্প স্ট্যাম্পটি স্পষ্টভাবে উল্লেখ করেছি, যাতে যে কেউ বুঝতে পারে যে আমরা তারিখ এবং সময় উভয় নিয়েই কথা বলছি। তবে আপনিও সঠিক। উত্তরটি পরিবর্তন করেছেন।
অশ্বিনী মোহন

3

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


1

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


2
হ্যাঁ আছে: timestampএটি এসকিউএল স্ট্যান্ডার্ড সংজ্ঞায়িত করে।
স্ট্রিম

0

প্রচুর স্টাফ পড়ার পরে, বিগিন্টে ইউটিসি ইউনিক্সের সময়টি সর্বোত্তম সমাধান বলে মনে হচ্ছে। প্রয়োজনে টাইম জোনের স্টোরেজের জন্য ভ্রচারে টিজেডবি টাইমসোন আইডি। কয়েকটি যুক্তি:

  1. টাইমস্ট্যাম্প এবং ডেটটাইম পটভূমিতে একগুচ্ছ নকল রূপান্তর করে যা জটিল বলে মনে হয় এবং পরিষ্কার নয়। সার্ভার স্থানীয় সময় থেকে ইউটিসি বা সার্ভারের সময় এবং পিছনে স্যুইচ করে, কখনও কখনও, না হয়। প্রতিটি ক্রিয়াকলাপের জন্য একগুচ্ছ গোপন ওভারহেড।

  2. বিজিআইএনটি (8 কেবি) কমপক্ষে হালকা বা হালকা হিসাবে হালকা বা হালকা xXXXXX.XXXX ফর্ম্যাট স্টোরেজ জন্য প্রয়োজনীয় যা মাইএসকিউএল দ্বারা কার্যত দুটি আইএনটি + কিছু হিসাবে সংরক্ষণ করা হয় । এবং এটি বহু শতাব্দী আগে সংরক্ষণ করা যথেষ্ট।

  3. খুব সুন্দর সমস্ত বড় প্রোগ্রামিং ভাষার ইউনিক্স সময়ের সাথে কাজ করার জন্য স্ট্যান্ডার্ড ফাংশনের লাইব্রেরি রয়েছে।

  4. বিগিন্টের সাথে গণিত ক্রিয়াকলাপগুলি কোনও হার্ডওয়ারের চেয়ে অন্য যে কোনও কিছুর চেয়ে দ্রুত বা দ্রুত হওয়া উচিত।

অবশ্যই উপরের সমস্তগুলি বড়, আন্তর্জাতিক প্রকল্পগুলির জন্য প্রাসঙ্গিক। ছোট কিছু জন্য, নির্বাচিত ফ্রেমওয়ার্কের ডিফল্ট ফর্ম্যাটটির সাথে যাওয়া যথেষ্ট ভাল বলে মনে হচ্ছে।


2
" ব্যাকগ্রাউন্ডে এমন একগুচ্ছ রুপান্তর রূপান্তরগুলি করুন যা দেখে মনে হচ্ছে ... পরিষ্কার নয় " - আপনি কোন ডিবিএমএসের কথা বলছেন? কোনও timestampকলামের জন্য কোনও "জিমিকি রূপান্তর" ঘটবে না (ডাটাবেস স্তরটিতে) এবং এর জন্য timestamp with time zoneম্যানুয়ালগুলিতে (কমপক্ষে ওরাকল এবং
পোস্টগ্রিসের

1
"খুব সুন্দর সব বড় প্রোগ্রামিং ল্যাঙ্গুয়েজে ইউনিক্স সময়ের সাথে কাজ করার জন্য স্ট্যান্ডার্ড ফাংশনগুলির গ্রন্থাগার রয়েছে।" এবং তবুও আপনি এসএসকিউএল / ডিবিএমএসের তারিখ, তারিখের সময় এবং টাইমস্ট্যাম্পগুলি সম্পর্কে আপনার সমস্ত বিগিন্ট ব্যবহারের পছন্দ সহ সমস্ত গ্রন্থাগার এবং ফাংশনগুলি ছুঁড়ে ফেলেছেন ...
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.