আমি এসকিউএল প্রশ্নের উত্তর দেওয়ার জন্য অনেক সময় ব্যয় করি। আমি প্রায়শই এই জাতীয় প্রশ্নগুলি দেখতে পাই:
SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'
SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'
SELECT * FROM person WHERE birthdate BETWEEN 'some string' AND 'other string'
যেমন হয় প্রদত্ত প্যারামিটারগুলির স্ট্রিং থেকে তারিখের (খারাপ) অবধি রূপান্তরকে নির্ভর করে বা এক্স মিলিয়ন ডাটাবেস সারি মানগুলিকে স্ট্রিংয়ে রূপান্তর করে এবং একটি স্ট্রিং তুলনা করে (আরও খারাপ) করে
আমি মাঝেমধ্যে একটি মন্তব্য করি, বিশেষত যদি এটি উচ্চ প্রতিনিধি ব্যবহারকারী যারা স্মার্ট উত্তর লেখেন তবে আমি যাকে অনুভব করি তাদের ডেটা ধরণের সাথে কম আস্তে আস্তে টাইপ করা উচিত
মন্তব্যটি সাধারণত ফর্মটি গ্রহণ করে যে সম্ভবত তারা তার স্ট্রিংগুলিকে স্পষ্টভাবে তারিখগুলিতে রূপান্তর করে টু_ডেট (ওরাকল), স্ট্র_টো_ডেট (মাইএসকিউএল), রূপান্তর (এসকিউএলএসইআরভিআর) বা অন্য কিছু অনুরূপ পদ্ধতি ব্যবহার করে: সম্ভবত এটি আরও ভাল হবে:
--oracle
SELECT * FROM person WHERE birthdate BETWEEN TO_DATE('20170101', 'YYYYMMDD') AND TO_DATE('20170301', 'YYYYMMDD')
--mysql
SELECT * FROM person WHERE birthdate BETWEEN STR_TO_DATE('20170101', '%Y%m%d') AND STR_TO_DATE('20170301', '%Y%m%d')
--SQLS, ugh; magic numbers
SELECT * FROM person WHERE birthdate BETWEEN CONVERT(datetime, '20170101', 112) AND CONVERT(datetime, '20170301', 112)
এটি করার জন্য আমার প্রযুক্তিগত ন্যায়সঙ্গততাগুলি হ'ল এটি তারিখের ফর্ম্যাট হিসাবে স্পষ্ট, এবং কয়েকটি উত্সের পরামিতি অবশ্যই লক্ষ্য কলামের ডেটাটাইপ হয়ে গেছে তা নিশ্চিত করে। এটি কোনও সম্ভাবনা রোধ করে যে ডাটাবেসটি একটি অন্তর্নিহিত রূপান্তর ভুল (খুব প্রথম উদাহরণের 3 শে জানুয়ারী / 1 ম মার্চ যুক্তি) পাবে এবং এটি ডিবি টেবিলে একটি মিলিয়ন তারিখের মানগুলিকে স্ট্রিংয়ে রূপান্তর করতে বাধা দেয় (কিছু সার্ভার নির্দিষ্ট তারিখ ব্যবহার করে) ফর্ম্যাটিং যা তুলনামূলকভাবে করার জন্য বর্গক্ষেত্রের মধ্যে স্ট্রিং প্যারামিটারগুলিতে তারিখের ফর্ম্যাটটির সাথে মেলে না -
এটি করার জন্য আমার সামাজিক / একাডেমিক সমর্থনযোগ্যতা হ'ল এসও একটি শিক্ষণ সাইট; এর উপরের লোকেরা সুস্পষ্ট বা স্পষ্টভাবে জ্ঞান অর্জন করে। উত্তর হিসাবে এই কোয়েরি দিয়ে একটি নবাগত আঘাত করতে:
SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01'
তাদের এগুলি বোধগম্য মনে করতে নেতৃত্ব দিতে পারে, তারা পছন্দ করে এমন কিছু ফর্ম্যাটের জন্য তারিখটি সামঞ্জস্য করে:
SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017'
তারা যদি কমপক্ষে তারিখটি রূপান্তর করার জন্য কিছু স্পষ্ট প্রচেষ্টা দেখে থাকে তবে তারা তাদের অদ্ভুত তারিখের ফর্ম্যাটটির জন্য এটি করা শুরু করতে পারে এবং উত্থাপিত হওয়ার আগে কিছু চিরতরে-বাগ হত্যা করে। সর্বোপরি, আমরা (আমি) লোকদের এসকিউএল ইনজেকশন অভ্যাসে প্রবেশ করা থেকে বিরত রাখি (এবং যদি কেউ @pBirthdate
ফ্রন্টএন্ডে ডেটটাইম টাইপ থাকে তখন কোনও প্রশ্নটি প্যারামিটারাইজিং করার পরামর্শ দেয় এবং তারপরে ড্রাইভারটিকে স্ট্রিং হিসাবে ঘোষণা করে ?)
আমি আমার সুপারিশ করার পরে যা ঘটে তা ফিরে: আমি সাধারণত "স্পষ্ট হয়ে থাকি, এক্স" সুপারিশটি ব্যবহার করি, যেমন "প্রত্যেকেই এটি করে", "এটি সর্বদা আমার জন্য কাজ করে", "আমাকে কিছু ম্যানুয়াল বা রেফারেন্স ডক দেখান এটি বলে যে আমার স্পষ্ট হওয়া উচিত "বা" কী ?? "
আমি এর কয়েকটিটির প্রতিক্রিয়াতে জিজ্ঞাসা করেছি, তারা WHERE age = '99'
বয়সকে স্ট্রিং হিসাবে পেরিয়ে কোনও ইনট কলাম অনুসন্ধান করবে কিনা । "মূর্খ হয়ে উঠবেন না," অনুসন্ধান করার সময় আমাদের "লাগানোর দরকার নেই" প্রতিক্রিয়া আসে, তাই কোথাও কোথাও তাদের মনের মধ্যে বিভিন্ন ডেটা ধরণের জন্য কিছু প্রশংসা পাওয়া যায় তবে লজিকাল লিপটির সাথে কেবল কোনও সংযোগ নেই যা কোনও অনুসন্ধান অনুসন্ধান করে একটি স্ট্রিং (আপাতদৃষ্টিতে মূর্খ) পাস করে কলাম এবং একটি স্ট্রিং পেরিয়ে একটি তারিখ কলাম অনুসন্ধান করা (স্পষ্টতই বুদ্ধিমান) ভণ্ডামি
সুতরাং আমাদের এসকিউএলগুলিতে আমাদের কাছে একটি সংখ্যা হিসাবে জিনিস (সংখ্যাসূচক ব্যবহার করা উচিত, সীমানা ছাড়াই), স্ট্রিং স্ট্রিং হিসাবে জিনিসগুলি (অ্যাডোস্ট্রোফ ডেলিফিটরগুলির মধ্যে যে কোনও কিছু ব্যবহার করুন) .. কেন তারিখের জন্য কোনও ডিলিমিটার নেই? এটি বেশিরভাগ ডিবিতে এমন একটি মৌলিক ডেটা টাইপ? জাভাস্ক্রিপ্ট আমাদের /
কিছু অক্ষরের উভয় পাশ রেখে একটি রেজেক্স নির্দিষ্ট করতে দেয় ঠিক একইভাবে কোনও তারিখ লেখার একটি উপায় থাকার মাধ্যমে এই পুরো জিনিসটি সমাধান করা যেতে পারে । /Hello\s+world/
। খেজুরের জন্য কিছু নেই কেন?
প্রকৃতপক্ষে, আমার জ্ঞানের কাছে, (কেবলমাত্র) মাইক্রোসফ্ট অ্যাক্সেসের এমন প্রতীক রয়েছে যা নির্দেশ করে যে "এই বিতরণকারীদের মধ্যে একটি তারিখ লেখা হয়েছে" যাতে আমরা একটি ভাল শর্টকাট পেতে পারি WHERE datecolumn = #somedate#
তবে তারিখের উপস্থাপনাটি এখনও সমস্যা দেওয়ার জন্য দায়বদ্ধ যেমন মিমি / ডি বনাম ডিডি / মিমি, কারণ এমএস সর্বদা স্টাফ দিয়ে দ্রুত এবং আলগা খেলেছে ভিবি ভিড় ভেবেছিল এটি একটি ভাল ধারণা
মূল বিন্দুতে ফিরে: আমি যুক্তি দিচ্ছি যে এই মাধ্যমের সাথে স্পষ্ট হওয়া বুদ্ধিমান যা আমাদের বিভিন্ন উপাত্ত সংকেতকে স্ট্রিং হিসাবে পাস করতে বাধ্য করে ..
এটি কি বৈধ দাবি?
আমার কি এই ক্রুসেড চালিয়ে যাওয়া উচিত? এটি কি একটি বৈধ পয়েন্ট যে স্ট্রিংলি টাইপিং একটি আধুনিক নম্বর-নয়? অথবা প্রতিটি আরডিবিএমএস (প্রাচীন সংস্করণ সহ) সেখানে উপস্থিত থাকবে, যখন কোনও প্রশ্নের WHERE datecolumn = 'string value'
সঠিকভাবে স্ট্রিংটিকে একটি তারিখে রূপান্তরিত করে টেবিলের ডেটা রূপান্তর না করে / সূচকের ব্যবহার না হারিয়ে অনুসন্ধান করবেন? কমপক্ষে ওরাকল ৯ এর ব্যক্তিগত অভিজ্ঞতা থেকে আমি সন্দেহ করি না, আমি সন্দেহ করি যে কিছু আইএসও স্ট্যান্ডার্ড ফর্ম্যাটে স্ট্রিংগুলি সর্বদা লেখা থাকে এবং কলামটি কিছু তারিখের স্বাদে থাকে তবে কিছুটা কিছু-এর-সাথে-দৃশ্য-পরিস্থিতিও থাকতে পারে suspect স্ট্রিং প্যারামিটার সর্বদা সঠিকভাবে স্পষ্টভাবে রূপান্তরিত হবে। এটি কি ঠিক করে দেয়?
এটা কি সার্থক কাজ?
অনেক লোক এটি পেয়েছে বলে মনে করে না, বা যত্ন করে না বা কিছু ভণ্ডামি প্রদর্শন করে যে তাদের ইনটস ইনটস তবে তাদের তারিখগুলি স্ট্রিংস .. সর্বাধিক সাধারণ যে খুব কম লোকই কখনও গোল হয়ে গেছে এবং বলেছে "আপনি জানেন কি, আমি আপনার বক্তব্যের সাথে একমত I'll আমি এখন থেকে আমার তারিখগুলি সম্পর্কে স্পষ্ট থাকব "।
WHERE age = '0x0F'
যে কোনও ডাটাবেস পনেরো বছরের বাচ্চাদের অনুসন্ধান করবে এই আশা করার বৈধ উপায় কিনা ..
WHERE datecolumn =
01/02 / 12' with এর সাথে সমস্যায় পড়ে থাকতে দেখেছি যেখানে তারা সম্ভবত ১৯১২, ২০১২, 2001, ১৯০১, ১২ বা ১. বছরের জন্য জিজ্ঞাসা করছে এটি ডাটাবেস বিশ্বের বাইরেও সমস্যা, সংখ্যা প্রোগ্রামাররা যারা বুঝতে পারছেন না যে কেন"09"
কোনও ইন্টিতে রূপান্তর করায়