আপনি কীভাবে "ফাজি তারিখগুলি" একটি ডাটাবেসে সংরক্ষণ করবেন?


125

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

আপনি ডেটটাইম ক্ষেত্রটি ব্যবহার করতে পারবেন না, কারণ "মে 1978" একটি বৈধ তারিখ নয়। আপনি যদি এটি একাধিক কলামে বিভক্ত করেন তবে আপনি ক্যোয়ার করার ক্ষমতা হারাবেন। অন্য কেউ কি এতে প্রবেশ করেছে, যদি তাই হয় তবে আপনি এটি কীভাবে পরিচালনা করেছিলেন?

আমি যে সিস্টেমটি তৈরি করছি তা স্পষ্ট করতে, এটি এমন একটি সিস্টেম যা সংরক্ষণাগারগুলি ট্র্যাক করে। কিছু সামগ্রী অনেক দিন আগে তৈরি হয়েছিল এবং আমরা যা জানি তা হ'ল "মে 1978"। আমি এটিকে 1 ম 1978 হিসাবে সংরক্ষণ করতে পারলাম, তবে কেবল এই উপায়টিই বোঝাতে যে এই তারিখটি কেবলমাত্র মাসের সাথে সঠিক। কয়েক বছর পরে যখন আমি সেই সংরক্ষণাগারটি পুনরুদ্ধার করছি, তারিখগুলি মেলে না তখন আমি বিভ্রান্ত হই না।

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


14
"1978 সালের 1 মে অজানা দিন" "1 ম মে, 1978" এর সাথে পার্থক্য করা কি গুরুত্বপূর্ণ?

5
@ মিশেলটি: হ্যাঁ, পার্থক্য করা গুরুত্বপূর্ণ is
nbv4


6
@ এসলাম: বেশিরভাগ ডাটাবেস সিস্টেমগুলি এটিকে একটি অবৈধ তারিখের মান হিসাবে প্রত্যাখ্যান করবে
nbv4

9
@ জিমিহোফা - আপনি কখনই কোনও অস্পষ্ট তারিখের দৃশ্যে বা ইতিহাসের তুলনা করার দরকার নেই? উভয় ক্ষেত্রেই, একটি সাধারণ একটি চিকিত্সা ইতিহাস: আপনার মনে আছে যে গত এপ্রিল 1 এ এপেন্ডেকটমি ছিল, তবে টনসিলেক্টোমিটি 1975 সালে ছিল এবং কিছু বছরের মে এবং জুনের সময় ঘটেছিল। যদি আপনি জানতে চান যে কোনও মেডিকেল ইভেন্টটি ছিল অন্য কোনও মেডিকেল ব্রেকথ্রুয়ের আগে বা তার পরে? তারা এইচআইভির রক্ত ​​সরবরাহের পরীক্ষা করার আগে বা তার পরে কি হয়েছিল?
বৃহস্পতিবার

উত্তর:


148

সাধারণ তারিখের ডেটাবেজে ডেটাবেজে সমস্ত তারিখ সঞ্চয় করে রাখুন এবং ডেট ক্ষেত্রটি আসলে কতটা সঠিক তার অতিরিক্ত নির্ভুলতা ক্ষেত্র রাখুন।

date_created DATE,
date_created_accuracy INTEGER, 

তারিখ_স্রষ্ট_অক্ষমতা: 1 = সঠিক তারিখ, 2 = মাস, 3 = বছর।

যদি আপনার তারিখটি অস্পষ্ট হয় (উদাঃ মে 1980) এটি পিরিয়ডের শুরুতে সংরক্ষণ করুন (উদাঃ 1 মে মে 1980)। অথবা যদি আপনার তারিখটি বছরের যথাযথ হয় (উদাহরণস্বরূপ 1980) এটি 1 লা জানুয়ারী হিসাবে সঞ্চয় করুন। 1980 যথাযথ নির্ভুলতার মান সহ।

এই উপায়টি কিছুটা প্রাকৃতিক উপায়ে সহজেই জিজ্ঞাসা করতে পারে এবং এখনও সঠিক তারিখগুলির ধারণা রয়েছে not উদাহরণস্বরূপ এটি আপনাকে Jan 1st 1980এবং এর মধ্যে তারিখগুলি জিজ্ঞাসা করতে Feb 28th 1981এবং अस्पष्ट তারিখগুলি 1980এবং পেতে দেয় May 1980


1
আমি এখনও যা দেখতে পাচ্ছি তা থেকে আপনাকে এখানে ডেট-এন্ডের গণনা করতে হবে, সুতরাং আমি মনে করি যে কোয়েরিটির মধ্যে বেশ কুৎসিত হওয়ায় আপনি একটি গণনা করা ক্ষেত্র পেয়েছেন যা আপনি সর্বোপরি নির্বাচন করছেন।
ওয়াট বার্নেট

8
দুর্দান্ত উত্তর, সত্যিই স্মার্ট। select * from mytable where date_created between "1980/1/1" and "1981/2/28" and date_created_accuracy <= 2;। জিনিয়াস।
নাফতুলি কে

58
আমি আপনাকে তারিখের নির্ভুলতাটিকে কেবল "দিন" হিসাবে বিবেচনা করতে উত্সাহিত করব। সঠিক দিনটি যেখানে 0 হয় এইভাবে কেউ শক্ত এনকোডযুক্ত নির্দিষ্ট তারিখের রেঞ্জের পরিবর্তে 1 লা জুনের ভিত্তিতে 90 দিনের তারিখের নির্ভুলতার সাথে "গ্রীষ্মের কিছু সময়" আরও নমনীয় তারিখগুলি ব্যবহার করতে পারেন। এটি বহু বছরের নির্ভুলতাও পরিচালনা করতে পারে।

1
আপনার সম্ভবত উত্তর হিসাবে এটি জমা দেওয়া উচিত,
মাইকেলটি

1
+1: এই সমাধান সম্পর্কে আরও একটি দুর্দান্ত জিনিস হ'ল আপনি date_created_accuracyক্ষেত্রের মানের উপর ভিত্তি করে প্রদর্শন যুক্তি যুক্ত করতে পারেন । ক্ষেত্রটি যতটা সঠিকভাবে ইঙ্গিত দেয় আপনি ফলাফলগুলি বা ইউআইতে "মে 1980" বা "" 1980 "প্রদর্শন করতে পারেন।
কিরেলেসা

27

আপনার যদি নিয়মিত তারিখ-সময় তথ্য হিসাবে এই ধরণের ডেটা ব্যবহার করার প্রয়োজন না হয় তবে কোনও সাধারণ স্ট্রিং ফর্ম্যাট করতে পারে।

তবে আপনার যদি সমস্ত কার্যকারিতা রাখার প্রয়োজন হয় তবে আমি দুটি ভাবনা চিন্তা করতে পারি, উভয়ই ডেটাবেজে সঞ্চিত অতিরিক্ত তথ্য প্রয়োজন:

  1. তৈরি min dateএবং max dateক্ষেত্রগুলি, যার "অসম্পূর্ণ" ডেটার জন্য আলাদা মান রয়েছে তবে সঠিক তারিখের সাথে মিলবে।
  2. প্রতিটি ধরণের ভুল তারিখের জন্য প্রকারগুলি তৈরি করুন (কোনও _0, তারিখ_বিহীন _ 1, মাস_মিশিং _ 2, বছর_সৃজন 1997) ইত্যাদি _ যাতে আপনি তাদের একত্রিত করতে পারেন)। typeরেকর্ডগুলিতে একটি ক্ষেত্র যুক্ত করুন এবং কোন তথ্য অনুপস্থিত তা রাখুন।

ন্যূনতম এবং সর্বাধিক তারিখের ক্ষেত্রগুলিও আমার প্রথম চিন্তা ছিল।
মাইকেল Itzoe

1
দীর্ঘ শুরু করার আগে, আমাদের ঠিক একই সমস্যাটি সমাধান করতে হয়েছিল। ব্যবহারকারীরা অতীতে যে কোনও সময় ঘটে যাওয়া ইভেন্টগুলির গল্প বলতে পারত, তাই আমাদের अस्पष्ट তারিখগুলি সমর্থন করতে হয়েছিল। অনেক পিছিয়ে যাওয়ার পরে, আমরা যে সমাধানটি পৌঁছেছিলাম তা এখানে সুপারমের পরামর্শের সাথে সাদৃশ্য, যেখানে তারিখগুলি সর্বনিম্ন ও সর্বাধিক সম্ভাব্য তাত্ক্ষণিক হিসাবে সংরক্ষণ করা হয় যাতে গল্পের তারিখ থাকবে। তারিখটি প্রতিবেদন করার সময়, সঠিকতা (যেমন "এই রেকর্ডটি মাস / বছর / দিনের সাথে সঠিক") ন্যূনতম ও সর্বোচ্চ তারিখের মধ্যে ব-দ্বীপ থেকে উত্তোলন করা যেতে পারে। নির্ভুলতার জন্য 3 য় ক্ষেত্র সংরক্ষণ করার দরকার নেই।
মিলিত 16

4
+ 1- min dateএবং max dateক্ষেত্র। আমি মনে করি যে এটি সবচেয়ে নমনীয়, তবুও সুনির্দিষ্ট এবং সহজেই ব্যবহারযোগ্য সমাধান।
Supr

1
আমি প্রথমে এই ধারণার বিরোধী ছিলাম। তবে এটি উপলব্ধি করা সবচেয়ে নমনীয় পদ্ধতি, আমি এটির পক্ষে ভোট দিই।
অনুরাগ কালিয়া

এটা কেবল প্রাকৃতিক। আপনি এতটা ঝাপসা তারিখ নয় বরং একটি সময়সীমার বর্ণনা করছেন ..... যার শুরু এবং শেষ রয়েছে।
পিটার বি

20

এটি প্রযুক্তিগত সমস্যার চেয়ে প্রয়োজনীয়তার সংজ্ঞা হিসাবে আরও বেশি - আপনাকে কীসের দিকে ফোকাস করতে হবে তা হল "আমরা কীভাবে অতীতের তারিখগুলি সংজ্ঞায়িত করতে পারি" এবং প্রযুক্তিগত সমাধান প্রবাহিত হবে।

যে সময়টির সাথে আমার সাধারণত এমনভাবে যোগাযোগ করা হয়েছিল:

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

কখনও কখনও কাউকে কিছু করার দরকার হয় যেমন তারিখগুলি অস্পষ্ট করে তোলে - উদাহরণস্বরূপ, এক তারিখের জন্য মে 1978 এ যে কোনও কিছুর জন্য কোনও প্রশ্নের উত্তর দিতে হতে পারে This এটি করণীয় - কেবল আপনার তৈরি_ তারিখ 2 ক্ষেত্র তৈরি করুন, পুরানো রেকর্ডগুলি 30 পাবে দিনগুলি যথাযথভাবে ছড়িয়ে পড়লে নতুনরা 2 টি অভিন্ন মান পায়।


1
+1 - আমি দ্বৈত তারিখের পদ্ধতির সাথে উত্তর তৈরির কাজ করছিলাম। আপনার উত্তরটি এখানে প্রথম পেয়েছে।

2
+1, এটি কুরুচিপূর্ণ এবং নতুন এন্ট্রিগুলির প্রয়োজন হয় না এর জন্য প্রচুর অকেজো অতিরিক্ত তথ্য তৈরি করে, তবে অন্যদিকে এটি কোয়েরিগুলির তুলনায় তারা আরও বেশি সহজ রাখে। আমরা কিছুদিনের জন্য সম্পর্কিত সমস্যার জন্য একই জাতীয় সমাধানটি ব্যবহার করছি।
ইজকাটা

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

1
এনাম মানগুলির বিস্ফোরণ ছাড়াই নির্বিচারে গ্রানুলারিটি বোঝাতে সক্ষম হওয়ার জন্য +1।
ড্যান নীলি

18

তারিখটি নির্ভুল হলে চিহ্নিত করার সহজ উপায় হ'ল ডিফল্ট NULL সহ একটি নির্ভুলতা ক্ষেত্র INT (1) তৈরি করা is

যদি তারিখটি সঠিকভাবে তারিখের তারিখ হয় তবে "তারিখ_ক্রেটেড" এবং সঠিকতা ছেড়ে দিন NULL

যদি তারিখটি যথার্থ মান 1 সহ মাসের 1 ম হিসাবে মাসের স্টোরের তারিখের সময় থেকে সঠিক হয়

যদি তারিখটি যথাযথ মান 2 সহ বছরের 1 ম জানুয়ারীর তারিখ-সময়ের জন্য সঠিক হয়

আপনি বিভিন্ন মান যেমন প্রথম ত্রৈমাসিক ইত্যাদি ধরে রাখতে বিভিন্ন সংখ্যা ব্যবহার করতে পারেন


আপনি যখন এটিগুলি করেন তখন প্রশ্নগুলি সত্যিই লোমশ হয়ে যায়।
blrfl

3
এটিতে এমন ডেটা নিয়ে অসুবিধা রয়েছে যা "মাস 2 1991" এবং "শীতকালীন 1978-1979" এর মতো পরিষ্কার মাসের সীমানায় নেই।

1
ওপির নির্দেশক হিসাবে কিছু উপায় চায় যে এই তারিখটি কেবলমাত্র মাসের সাথে সঠিক।
ডেভিড স্ট্র্যাচান

7
আপনি এখানে NULL এর অর্থ আপত্তি করছেন। নুল অর্থ "অজানা", সুতরাং তারিখটি সঠিক হলে নির্ভুলতা NULL হতে পারে না। এটি '1' হতে পারে।
কোনারাক

@ کونারাক শব্দার্থকভাবে হ্যাঁ। তবে বেশিরভাগ তারিখগুলি সঠিক হওয়ায় কেবলমাত্র বিশেষ কেসগুলি সনাক্ত করতে হবে এবং এখানে NUL কে ডিফল্ট হিসাবে ব্যবহার করা দরকার।
ডেভিড স্ট্র্যাচন

17

অতীতে আমি তারিখ-নির্ভুলতার সাথে শুরুর তারিখ এবং শেষের তারিখ হিসাবে সংরক্ষণ করেছি। দিন 21212012 শুরু = 12 am,may21,2012 এবং শেষ = 12 am,may22,2012 হিসাবে উপস্থাপন করা হবে। ২০১২ সালটি শুরু হবে = সকাল 12 টা, জন 1,2012 শেষ = 12 am, জন 1,2013 হিসাবে উপস্থাপন করা হবে।

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

যাইহোক, আপনি যখন মানুষের অনুবাদ করার চেষ্টা করছেন না, তখন কেন্দ্র + নির্ভুলতার চেয়ে শেষ পয়েন্টগুলির সাথে প্রোগ্রামিং করা অনেক সহজ। আপনি প্রচুর মামলা দিয়ে শেষ করবেন না। বেশ সুন্দর।


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

@ সুপ্রাপ্ত নির্ধারণ করা যদি একটি নির্দিষ্ট দ্বিতীয়টি নির্দিষ্ট মানব পিরিয়ডের সীমান্তে থাকে তবে এটি নিজেই একটি কঠিন সমস্যা। বিশেষত দীর্ঘ সময় ধরে, পৃথিবীর ঘূর্ণন হ্রাস হ্রাস এবং স্থানীয় সময়ের মানুষের সংজ্ঞাতে অবিরাম ছোট পরিবর্তনগুলি।
ক্রেগ গিডনি

14

কেন দুটি তারিখ সংরক্ষণ করবেন না।

তৈরি_পরবর্তী এবং তৈরি_পূর্বক। আসল শব্দার্থবিজ্ঞান "উপর বা তার পরে" এবং "তৈরি বা তার আগে তৈরি" হচ্ছে

সুতরাং আপনি যদি সঠিক তারিখটি জানেন তবে Created_After এবং Created_Be পূর্ব একই তারিখ হবে।

যদি আপনি জানেন যে 2000 সালের মে মাসে এটি প্রথম সপ্তাহ ছিল তবে তৈরি_আফটার = '2000-05-01' এবং তৈরি_বরেফর = '2000-05-07'।

আপনি যদি কেবল 1999 সালের মে জানেন তবে মানগুলি হবে '1999-05-01' এবং '1999-05-30'।

যদি এটি "'42 এর গ্রীষ্ম" হয় তবে মানগুলি '1942-06-01' এবং '1942-08-31' হবে।

এই স্কিমাটি সাধারণ এসকিউএল দিয়ে জিজ্ঞাসা করা সহজ, এবং অ প্রযুক্তিগত ব্যবহারকারীর পক্ষে অনুসরণ করা বেশ সহজ।

উদাহরণ হিসেবে বলা যায় সব কাগজপত্র যে এটি পারে মে 2001 এর মধ্যে তৈরি করা হয়েছে:

SELECT * FROM DOCTAB WHERE Created_After < '2001-05-31' And Created_Before > 2001-05-01;

বিপরীতে সমস্ত 2001 নথি যা স্পষ্টভাবে মে 2001 এ তৈরি হয়েছিল তা সন্ধান করতে :

SELECT * FROM DOCTAB WHERE Created_After > '2001-05-01' And Created_Before < 2001-05-31;

1
আমি মনে করি এটি সবচেয়ে মার্জিত সমাধান।
পিটার বি

এটি সুপারএম এবং স্ট্রিল্যাঙ্কের উত্তরগুলির সমান। +1 যদিও আরও স্পষ্টভাবে ব্যাখ্যা করার জন্য এবং এটি জিজ্ঞাসা করা কত সহজ।
Supr

9

আইএসও 8601 তারিখের সময়ের ফর্ম্যাটটি সময়কাল সংজ্ঞা সহ আসে

2012-01-01P1M (পড়ুন: ২০১২, 1 লা জানুয়ারী, সময়কাল: 1 মাস) "জানুয়ারী 2012 এ" হওয়া উচিত।

আমি ডেটা সংরক্ষণ করতে এটি ব্যবহার করব । এটি করার জন্য আপনার স্ট্রিং টাইপের একটি ডাটাবেস ক্ষেত্রের প্রয়োজন হতে পারে। এটিতে কীভাবে বুদ্ধিমান অনুসন্ধান করা যায় এটি একটি ভিন্ন বিষয়।


ধারণার জন্য +1 তবে কীভাবে অনুসন্ধান এবং / বা অনুসন্ধান করতে হবে তার জন্য কোনও তারিখের ক্ষেত্রটি ব্যবহার না করার জন্য -1
ব্যবহারকারী 151019

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

3

সাধারণত, আমি এখনও এগুলিকে সাধারণ জিজ্ঞাসার তারিখ হিসাবে সঞ্চয় করি তবে কিছুটা কম নির্ভুলতা পাওয়া গেলেও সম্ভব is

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


3

আপনি যদি এটি একাধিক কলামে বিভক্ত করেন তবে আপনি ক্যোয়ার করার ক্ষমতা হারাবেন।

বল কে? আপনি যা করেন তা এখানে:

  1. 3 টি কলাম, দিন, মাস, বছর, প্রতিটি প্রকার টাইপ এবং চতুর্থ কলামে তারিখের টাইমের তারিখ রয়েছে।
  2. ট্রিগার রয়েছে যা 3 টি কলাম দিবস, মাস, বছর ব্যবহার করে থেইডেট তৈরি করতে যদি থেরেটটি শূন্য হয় তবে এক, দিন, মাস, বছরের ক্ষেত্রগুলির একটি মান থাকে।
  3. একটি ট্রিগার রয়েছে যা দিন, মাস, বছরের ক্ষেত্রগুলিকে জননেতিত করে যখন থেডেট সরবরাহ করা হয় তবে এই ক্ষেত্রগুলি হয় না।

সুতরাং আমি যদি এই জাতীয় কোনও সন্নিবেশ করি: insert into thistable (Day, Month, Year) values (-1, 2, 2012);তবে থেইডেটটি ২/১/২০১৩ এ পরিণত হবে তবে দিনের ক্ষেত্রে -১ থাকায় আমি তার সত্যই অনন্তকালীন তারিখটি জানব ২/২০১২ এ।

যদি আমি insert into thistable (TheDate) values ('2/5/2012');তখন দিবসটি 5 হয়, মাসটি 2 হবে, এবং বছরটি 2012 হবে এবং কারণ সেগুলির কোনওটিই -1 নয় তবে আমি জানতে পারি এটি সঠিক তারিখ।

আমি জিজ্ঞাসা করার ক্ষমতা হারাব না কারণ সন্নিবেশ / আপডেট ট্রিগারটি নিশ্চিত করে যে আমার 3 টি ক্ষেত্র (দিন, মাস, বছর) সর্বদা TheDate এ একটি ডেটটাইম মান উত্পন্ন করে যা অনুসন্ধান করা যেতে পারে।


3

অন্য বিকল্পটি হ'ল ফর্মের পূর্ণসংখ্যার হিসাবে তারিখগুলি সংরক্ষণ করা YYYYMMDD

  • আপনি কেবল জানেন যে বছরটি 1951: স্টোর হিসাবে 19510000
  • আপনি জানেন যে মাস এবং বছর মার্চ 1951: স্টোর হিসাবে 19510300
  • আপনি জানেন পুরো তারিখটি 14 মার্চ, 1951: স্টোর হিসাবে 19510314
  • একটি সম্পূর্ণ অজানা তারিখ: হিসাবে সংরক্ষণ করুন 0

উপকারিতা

আপনি নিজের अस्पष्ट তারিখ দুটি ক্ষেত্রের পরিবর্তে একটি ক্ষেত্রে বা একটি তারিখ এবং অন্যান্য উত্তরগুলির অনেকের পরামর্শ অনুসারে একটি যথার্থতা সঞ্চয় করতে পারেন।

অনুসন্ধানগুলি এখনও সহজ:

  • 1951 সালের সমস্ত রেকর্ড - SELECT * FROM table WHERE thedate>=19510000 and thedate<19520000
  • মার্চ 1951 এর জন্য সমস্ত রেকর্ড - SELECT * FROM table where thedate>=19510300 and thedate<19510400
  • সমস্ত রেকর্ড 14 ই মার্চ, 1951 - SELECT * FROM table where thedate=19510314

নোট

  • আপনার জিইউআইয়ের একটি দরকার GetDateString(int fuzzyDate)যা কার্যকর করা সহজ।
  • বাছাই করা সহজ বিন্যাস সহ সহজ। আপনার জানা উচিত যে অজানা তারিখগুলি প্রথম আসবে। আপনি মাস বা দিনের 99পরিবর্তে 'প্যাডিং' ব্যবহার করে এটিকে বিপরীত করতে পারেন 00

"1941-1942 এর শীতের" এর अस्पष्ट তারিখটি আপনি কীভাবে উপস্থাপন করবেন? এটি 1941 সালের ডিসেম্বর বা জানুয়ারী 1942 হতে পারে

1
আপনার প্রশ্নটি একটি সাধারণ সমাধানের ক্ষেত্রে সম্পর্কিত। মূল প্রশ্নটি এটিকে সমস্যা হিসাবে তালিকাভুক্ত করে না। পোস্ট করা প্রশ্নের উপর ভিত্তি করে, কখনও কখনও পুরো তারিখটি জানা যায়, কখনও কখনও কেবল বছর এবং মাস এবং কখনও কখনও কেবল বছর হয়। একটি अस्पष्ट তারিখের পরিসরের কোনও সমস্যা প্রয়োজন হিসাবে উল্লেখ করা হয়নি। আমি সম্মত হব যদি আপনার এই সমস্যাটি সমাধান করার দরকার হয় তবে আপনার দুটি তারিখের প্রয়োজন (যদিও, "" দুর্বল তারিখের ইনটস "হিসাবে পরিসীমাটি সংরক্ষণ করা" দুটি "শক্তির তারিখ সংরক্ষণ করার পক্ষে আরও নমনীয়তা সরবরাহ করতে পারে)।
রিক

1

আইএসও 8601 "ফাজি তারিখ" এর জন্য একটি বাক্য গঠনও নির্দিষ্ট করে। 12 ই ফেব্রুয়ারী, 2012 বিকাল 3 টা "2012-02-12T15" হবে এবং ফেব্রুয়ারী 2012 কেবল "2012-02" হতে পারে। এটি স্ট্যান্ডার্ড লেক্সিকোগ্রাফিক বাছাই করে সুন্দরভাবে প্রসারিত:

$ (echo "2013-03"; echo "2013-03"; echo "2012-02-12T15"; echo "2012-02"; echo "2011") | sort
2011
2012
2012-02
2012-02-12T15
2013-03

0

এখানে আমার গ্রহণ করা হয়:

অস্পষ্ট তারিখ থেকে ডেটটাইম অবজেক্টে যান (যা কোনও ডাটাবেসে ফিট হবে)

import datetime
import iso8601

def fuzzy_to_datetime(fuzzy):
    flen = len(fuzzy)
    if flen == 4 and fuzzy.isdigit():
        dt = datetime.datetime(year=int(fuzzy), month=1, day=1, microsecond=111111)

    elif flen == 7:
        y, m = fuzzy.split('-')
        dt = datetime.datetime(year=int(y), month=int(m), day=1, microsecond=222222)

    elif flen == 10:
        y, m, d = fuzzy.split('-')
        dt = datetime.datetime(year=int(y), month=int(m), day=int(d), microsecond=333333)

    elif flen >= 19:
        dt = iso8601.parse_date(fuzzy)

    else:
        raise ValueError("Unable to parse fuzzy date: %s" % fuzzy)

    return dt

এবং তারপরে একটি ফাংশন যা ডেটটাইম অবজেক্ট নেয় এবং এটিকে ফাজি তারিখে ফিরিয়ে দেয়।

def datetime_to_fuzzy(dt):
    ms = str(dt.microsecond)
    flag1 = ms == '111111'
    flag2 = ms == '222222'
    flag3 = ms == '333333'

    is_first = dt.day == 1
    is_jan1 = dt.month == 1 and is_first

    if flag1 and is_jan1:
        return str(dt.year)

    if flag2 and is_first:
        return dt.strftime("%Y-%m")

    if flag3:
        return dt.strftime("%Y-%m-%d")

    return dt.isoformat()

এবং তারপরে একটি ইউনিট পরীক্ষা। আমি কোন মামলা মিস করেছি?

if __name__ == '__main__':
    assert fuzzy_to_datetime('2001').isoformat() == '2001-01-01T00:00:00.111111'
    assert fuzzy_to_datetime('1981-05').isoformat() == '1981-05-01T00:00:00.222222'
    assert fuzzy_to_datetime('2012-02-04').isoformat() == '2012-02-04T00:00:00.333333'
    assert fuzzy_to_datetime('2010-11-11T03:12:03Z').isoformat() == '2010-11-11T03:12:03+00:00'

    exact = datetime.datetime(year=2001, month=1, day=1, microsecond=231)
    assert datetime_to_fuzzy(exact) == exact.isoformat()

    assert datetime_to_fuzzy(datetime.datetime(year=2001, month=1, day=1, microsecond=111111)) == '2001'
    assert datetime_to_fuzzy(datetime.datetime(year=2001, month=3, day=1, microsecond=222222)) == '2001-03'
    assert datetime_to_fuzzy(datetime.datetime(year=2001, month=6, day=6, microsecond=333333)) == '2001-06-06'

    assert datetime_to_fuzzy(fuzzy_to_datetime('2002')) == '2002'
    assert datetime_to_fuzzy(fuzzy_to_datetime('2002-05')) == '2002-05'
    assert datetime_to_fuzzy(fuzzy_to_datetime('2002-02-13')) == '2002-02-13'
    assert datetime_to_fuzzy(fuzzy_to_datetime('2010-11-11T03:12:03.293856+00:00')) == '2010-11-11T03:12:03.293856+00:00'

এখানে একটি কোণার ঘটনা রয়েছে যেখানে একটি ঘটনা ঘটেছিল যা স্পষ্টভাবে ঘটেছিল 2001-01-01T00:00:00.333333তবে সিস্টেমটি "2001" হিসাবে কেবল ব্যাখ্যা করবে, তবে এটি খুব অসম্ভব বলে মনে হচ্ছে।


0

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

date date
dateCirca enum('Y', 'N')

আমরা কোনও ইভেন্টের তারিখ বা আমরা সত্যিকারের তারিখটি জানি না এমন ক্ষেত্রে "যথেষ্ট নিকটে" এমন একটি তারিখ নির্দেশ করতে তারিখ ক্ষেত্রটি ব্যবহার করি। আমরা সত্যিকারের তারিখটি জানি না এমন ইভেন্টে আমরা dateCircaক্ষেত্রটিকে চিহ্নিত করি Yএবং একটি যথেষ্ট পরিমাণ তারিখ দিয়ে থাকি , এটিকে "1 ম" হিসাবে চিহ্নিত করা হয়, যেমন

1st March, 2013  // We don't know the day of the month
1st January, 2013  // We don't know the month/day of the year
1st January, 2000  // We don't know the month/day/year, we only know the century

0

সংক্ষিপ্ত বিবরণ

অস্পষ্ট তারিখ-সময় (বা এমনকি অস্পষ্ট তারিখগুলি) সংরক্ষণের জন্য অনেকগুলি সম্ভাব্য উপস্থাপনা এবং এইভাবে ডাটাবেস স্কিমাস রয়েছে:

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

[1], [2] এবং [3] হ'ল সমস্ত (স্পষ্টভাবে) অভিন্ন অন্তর, অর্থাত্ সময়ে (সমানভাবে) সম্ভাব্য পয়েন্টগুলির একটি সেট।

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

[5] সম্ভবত সর্বাধিক সাধারণ কমপ্যাক্ট উপস্থাপনা যা (কিছুটা) ব্যবহারিক।

ইউনিফর্ম অন্তর

ইউনিফর্ম অন্তরগুলি (সম্ভাব্য) তারিখ-সময়ের মানগুলির একটি সেট উপস্থাপনের সহজতম কমপ্যাক্ট উপায়।

[১] এর জন্য, তারিখ-সময়ের মানের অংশগুলি অগ্রাহ্য করা হয়, অর্থাত্ সূচকযুক্ত নির্ভুলতা বা নির্ভুলতার চেয়ে সূক্ষ্ম ইউনিটের সাথে সংশ্লিষ্ট অংশগুলি; অন্যথায় এটি [2] এর সমতুল্য এবং নির্ভুলতা / নির্ভুলতা কোড একই ইউনিট (এবং 1 এর অন্তর্নিহিত পরিমাণ) এর অন্তর সমতুল্য।

[2] এবং [3] স্পষ্টতই সমতুল্য। [১] কার্যকর অন্তরগুলি যা [1] দ্বারা প্রতিনিধিত্ব করা যায় না, সেহেতু উভয়ের তুলনায় কঠোরভাবে কম ভাবপূর্ণ ex একটি अस्पष्ट তারিখ-সময়ের সমতুল্য 12 ঘন্টার ব্যবধান যা তারিখের সীমা বিস্তৃত হয়।

[1] ব্যবহারকারীর পক্ষে অন্য যে কোনও উপস্থাপনার চেয়ে ইনপুট করা সহজ এবং সাধারণত (কমপক্ষে কিছুটা) কম টাইপ করা দরকার। যদি তারিখের সময়গুলি বিভিন্ন পাঠ্যের উপস্থাপনগুলিতে ইনপুট হতে পারে, যেমন "2013", "2014-3", "2015-5-2", "7/30/2016 11p", "2016-07-31 18:15" , নির্ভুলতা বা নির্ভুলতা ইনপুট থেকে স্বয়ংক্রিয়ভাবে অনুমান করা যেতে পারে।

[1] এর নির্ভুলতা বা নির্ভুলতা ব্যবহারকারীদের কাছে পৌঁছে দেওয়ার জন্য একটি ফর্মকে রূপান্তর করা সবচেয়ে সহজ, উদাহরণস্বরূপ '2015-5 মাসের যথার্থতার সাথে' "মে 2015" তে পরিণত হয়েছে, "13 ই মে 2015 2 পি, প্লাস বা বিয়োগ 13.5 দিন" (মনে রাখবেন যে পরবর্তীকালে [1] যাইহোক প্রতিনিধিত্ব করা যাবে না)।

স্ট্রিংস

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

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

সম্ভাব্য বন্টন

সম্ভাব্য বিতরণগুলি অভিন্ন ব্যবধান উপস্থাপনাগুলি সাধারণকরণ করে [1], [2], [3], এবং (তর্কযোগ্যভাবে) (সাধারণ) স্ট্রিং প্রতিনিধিত্বের সমতুল্য [4]।

স্ট্রিংগুলির মাধ্যমে সম্ভাব্যতা বিতরণের একটি সুবিধা হ'ল পূর্বটি দ্ব্যর্থহীন।

[5-1] মানগুলির জন্য উপযুক্ত হবে যা (বেশিরভাগ) বিদ্যমান বন্টনের সাথে সামঞ্জস্য করে, উদাহরণস্বরূপ কোনও ডিভাইস থেকে একটি তারিখ-সময়ের মান আউটপুট যার জন্য পরিমাপ নির্দিষ্ট পরিমাণে বিতরণে মাপসই (বা চিন্তা) হিসাবে পরিচিত।

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


-1

আমি জেমস অ্যান্ডারসনের সমাধানটি সত্যিই পছন্দ করি - তারিখগুলিকে সঠিকভাবে সীমাবদ্ধ করা সর্বাধিক নমনীয় ক্যোয়ারী কাঠামো পাওয়ার উপায়। এটি অর্জনের আরেকটি উপায় হ'ল একটি স্টার্ট, এন্ড বা সমকেন্দ্রdate প্লাস একটি interval(কমপক্ষে পোস্টগ্র্যাসকিউএসএল , ওরাকল এবং এসকিউএএলএলএকএতে উপলব্ধ ) ব্যবহার করা।


-2

আপনার ক্ষেত্রে আপনার প্রয়োজন কেবল বছর, মাস এবং দিন। বছর এবং মাস প্রয়োজন, দিন alচ্ছিক। আমি এরকম কিছু ব্যবহার করব:

year smallint not null,
month smallint not null,
day smallint

এছাড়াও, আপনি এখনও খুব কার্যকরভাবে সূচকগুলি ব্যবহার করতে পারেন। (ক্ষুদ্র = বিয়োগ, কুইরগুলি আরও কিছুটা "জটিল" (আরও দীর্ঘ) পেতে পারে।


1
তবে এর অর্থ হ'ল যদি ফাজলতা মাসের অংশটি ধরে ফেলে তবে এই পদ্ধতির ব্যর্থতা।
অনুরাগ কালিয়া

1
@ আনুরাগকালিয়া - তাই মাসের ক্ষেত্রটিকে নালার করুন। কোনও কারণেই এটি পরবর্তী তারিখে পুনরায় কনফিগার করা যায়নি।
জেফো

যে শুধু একটি উদাহরণ ছিল। সমাধানটি অবশ্যই ভবিষ্যতের সমস্যাগুলিকে সামঞ্জস্য করার জন্য যথেষ্ট সাধারণ হতে হবে। আপনি যে রেঞ্জটি নির্দিষ্ট করেছেন তা যদি 15 মার্চ 2013 থেকে 22 মার্চ 2013 হয় তবে এই পদ্ধতিটি কার্যকর হয় না। উপরের সর্বনিম্ন উত্তরটি সর্বাধিক সাধারণ।
অনুরাগ কালিয়া

1
ওপিএস পোস্টে আপনি কি এ জাতীয় প্রয়োজনীয়তা পেয়েছেন বা এটি কেবল আপনার ফ্যান্টাসি?
ডানুবিয়ান নাবিক

মাসকে অযোগ্য করে তোলা আপনাকে কোনও দিন নির্দিষ্ট করতে দেয় তবে কোনও মাস নয়। কোন মানে হয় না। কবে ছিল 1978-??-31?
এমএসএলটার

-2

আমি কেবল সাধারণ তারিখের জন্য সঠিক সময়টি সঞ্চয় করে ফিজি তারিখের সময় অংশটিকে 00:00:00 এর মতো জেনেরিক করে তুলতাম। আমি তখন সমস্ত अस्पष्ट তারিখগুলি মাসের 1 ম তারিখ তৈরি করব।

আপনি যখন জিজ্ঞাসা, আপনি

  1. তারিখের ব্যাপ্তিগুলি পরীক্ষা করুন যেখানে সময়টি 00:00:00 এর সমান (अस्पष्ट)
  2. তারিখের ব্যাপ্তিগুলি পরীক্ষা করুন যেখানে সময়টি 00:00:00 (বাস্তব) এর সমান নয়
  3. তারিখের সীমা পরীক্ষা করুন তবে সময়ের অংশটি উপেক্ষা করুন (সম্মিলিত)

এর চেয়ে আরও ভাল সমাধান রয়েছে তবে আমি ব্যক্তিগতভাবে মেটাটাটা (আমার ডেটা সম্পর্কিত ডেটা) ঘৃণা করি। এর কিছুটা সময় পরে হাতছাড়া হয়ে যাওয়ার অভ্যাস রয়েছে।


2
00:00:00 সময় আসল তারিখের সাথে কীভাবে এই ডিল করবে?
gnat

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