আমার ডাটাবেস তারিখ ডেটাটাইপ ক্রুসেড সম্পর্কে: বৈধ? উপযুক্ত? অন্য কেউ কি তা অনুভব করে?


13

আমি এসকিউএল প্রশ্নের উত্তর দেওয়ার জন্য অনেক সময় ব্যয় করি। আমি প্রায়শই এই জাতীয় প্রশ্নগুলি দেখতে পাই:

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 datecolumn = 01/02 / 12' with এর সাথে সমস্যায় পড়ে থাকতে দেখেছি যেখানে তারা সম্ভবত ১৯১২, ২০১২, 2001, ১৯০১, ১২ বা ১. বছরের জন্য জিজ্ঞাসা করছে এটি ডাটাবেস বিশ্বের বাইরেও সমস্যা, সংখ্যা প্রোগ্রামাররা যারা বুঝতে পারছেন না যে কেন "09"কোনও ইন্টিতে রূপান্তর করায়
স্টিভ বার্নেস

2
আমি আমার উদাহরণটি প্রসারিত করার বিষয়ে জিজ্ঞাসা করার জন্য ভেবেছিলাম WHERE age = '0x0F'যে কোনও ডাটাবেস পনেরো বছরের বাচ্চাদের অনুসন্ধান করবে এই আশা করার বৈধ উপায় কিনা ..
কায়ুস জার্ড

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

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

1
জীবন আপনার যুদ্ধ বাছাই সম্পর্কে। আমার দৃষ্টিতে, এটি লড়াইয়ের পক্ষে ঠিক নয় ...
রবি ডি

উত্তর:


7

তুমি লিখেছিলে:

এই পরামিতিগুলি 1 ম জানুয়ারী থেকে তৃতীয় জানুয়ারী, বা 1 লা মার্চ ..

এটি অবশ্যই ত্রুটির সম্ভাব্য উত্স। এটি কোনও প্রশ্নকের দিকে ইঙ্গিত করা অন্য পাঠকদের পক্ষে সহায়ক হতে পারে, সুতরাং হ্যাঁ, এটি একটি বৈধ উদ্বেগ। তবে, গঠনমূলক হতে হবে, আমি

  • এএনএসআই এসকিউএল উল্লেখ করুন এবং সেই মানটি থেকে তারিখ বা ডেটাটাইম আক্ষরিক ব্যবহার করুন

  • নির্দিষ্ট ডিবিএমএসের সাধারণ, দ্ব্যর্থহীন তারিখের বিন্যাসটি ব্যবহার করুন (এবং কোন এসকিউএল ডায়ালেক্ট ব্যবহৃত হয় তা উল্লেখ করুন)

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

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

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

আমার কি এই ক্রুসেড চালিয়ে যাওয়া উচিত?

আমি আপনাকে একটি গোপন কথা বলি: আমি ধর্মীয় যুদ্ধকে ঘৃণা করি। তারা দরকারী কিছু হতে পারে না। সুতরাং, যদি এসকিউএল-এ দ্বিখণ্ডিত তারিখ / সময়ের চশমাগুলি সমস্যার কারণ হতে পারে, তবে তাদের উল্লেখ করুন, তবে লোকেদের আরও দৃ rig় হতে বাধ্য করার চেষ্টা করবেন না যদি এটি তাদের বর্তমান প্রসঙ্গে সত্যই কোনও সুবিধা না দেয়।


আমেরিকান বনাম সেনসিবল তারিখের ফর্ম্যাটগুলির অস্পষ্টতা সম্পর্কে এটি এতটা প্রশ্ন নয়। এসকিউএল স্টেটমেন্টে স্ট্রিং হিসাবে তারিখগুলি পাস করা বুদ্ধিমান কিনা এবং এটি আজ পর্যন্ত অন্তর্নিহিত রূপান্তরের উপর নির্ভর করে কিনা সে সম্পর্কে এটি। সমস্ত মিলিয়ন সারির জন্য মিলিয়ন তারিখ-> স্ট্রিং রূপান্তর করতে ডাটাবেসের প্রশ্নটি একটি পারফরম্যান্স দিক, এবং এটি কেবল একটি ক্যোয়ারির জন্য সেকেন্ডের 1/1000 তম সময় নিতে পারে, তবে এখন এটিকে সাম্প্রতিক সময়ের প্রসঙ্গে কল্পনা করুন it ব্যবহারকারীদের। বৃহত্তর পারফরম্যান্স ইস্যু হ'ল ডেটা রূপান্তর করার অর্থ সূচীগুলি আর ব্যবহার করা যাবে না এবং এটি সত্যই গুরুতর হতে পারে
Caius Jard

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

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

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

1
@ কাইসজার্ড: আপনি যদি অন্য শিল্প পেশাদারদের প্রভাবিত করতে চান তবে আপনার অবশ্যই ঠিক জানা উচিত কেন "পারফরম্যান্স অপটিমাইজেশন" "সুরক্ষা অপ্টিমাইজেশন" থেকে খুব আলাদা, এবং এখানেই আমার বক্তব্য - পারফরম্যান্সের সমস্যাগুলি ঘটে যাওয়ার পরে এটি পরিচালনা করা যায়, এটি খুব কমই হয় that অনেক দেরি সুরক্ষা সমস্যা নয়, সেগুলি হওয়ার আগে তাদের পুরোপুরি এড়ানো উচিত। সুতরাং দয়া করে কমলাগুলির সাথে আপেল তুলনা করবেন না। আপনি যদি ক্রুসেডের মত, নিরাপত্তা আর্গুমেন্ট অনেক ভালো এই জন্য ;-) উপযোগী হয়
ডক ব্রাউন

5

আপনার ক্রুসেড সমস্যার সমাধান করে না।

দুটি পৃথক সমস্যা রয়েছে:

  • এসকিউএলে অন্তর্নিহিত ধরণের রূপান্তর

  • अस्पष्ट তারিখের ফর্ম্যাটগুলি 05/06/07 এর মতো

আমি দেখতে পেয়েছি আপনি কোথায় ক্রুসেড নিয়ে এসেছেন তবে আমি মনে করি না যে সুস্পষ্ট রূপান্তরটি আসলে সমস্যার সমাধান করে:

  • তুলনার ক্ষেত্রে প্রকারের মধ্যে মিল নেই তবে প্রকৃত রূপান্তর এখনও ঘটে। যদি কোনও স্ট্রিংকে একটি তারিখের সাথে তুলনা করা হয়, এসকিউএল স্ট্রিংটিকে প্রথমে একটি তারিখে রূপান্তরিত করার চেষ্টা করবে। সুতরাং একটি সুস্পষ্ট রূপান্তরিত তারিখের মানের সাথে একটি তারিখ-টাইপ কলামের তুলনা করা স্ট্রিং-ফর্ম্যাটে একটি তারিখের সাথে তুলনা করার মতোই। কেবলমাত্র তফাতটি আমি দেখতে পাচ্ছি যদি আপনি কোনও কলামের সাথে একটি তারিখের মান তুলনা করেন যা আসলে তারিখগুলি না থাকলে তবে স্ট্রিংগুলি থাকে - তবে এটি কোনও ক্ষেত্রেই ত্রুটি হবে।

  • সুস্পষ্ট রূপান্তর ব্যবহার অ-আইএসও তারিখ বিন্যাসে অস্পষ্টতা সমাধান করে না।

আমি দেখতে পাই একমাত্র সমাধান:

  • স্ট্রিং-টাইপ কলামগুলিকে নন-স্ট্রিং মানগুলির সাথে তুলনা করবেন না।
  • কেবল কখনও আইএসও টাইপ তারিখের ফর্ম্যাটগুলি ব্যবহার করুন।

এবং অবশ্যই, স্ট্রিং-টাইপ কলামে কখনও তারিখগুলি সঞ্চয় করবেন না। তবে আবার, তারিখের আক্ষরিকের স্পষ্ট রূপান্তরকরণ এটিকে আটকাবে না।

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


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

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

@ ড্যাঙ্ক: ইটিএল একটি আলাদা সমস্যা - যদি আপনি কোনও সিএসভি ফাইল বা অন্য কোনও কিছু থেকে ডেটা পড়তে থাকেন তবে স্পষ্টতই আপনাকে ডেটাটি স্ট্রিং হিসাবে প্রসেস করতে হবে এবং স্পষ্টভাবে টাইপ করা মানগুলিতে পার্স করতে হবে। তবে ওপি বর্ণনা করছে এমন দৃশ্য নয়।
জ্যাকবিবি

এটি সহজেই পয়েন্ট হতে পারে যদিও আমি বর্ণনা করছি; কোনও সিএসভিতে সংখ্যার স্ট্রিং সম্পর্কে সুনির্দিষ্ট কিছু নেই যা পার্স করার সময় স্পষ্টভাবে ফর্ম্যাটটি ঘোষণার দাবি করে এবং এটি যুক্তিটির সাথে প্রাসঙ্গিক হয়ে ওঠে যদি আমি কোনও নবজাতক এসওতে কিছু উত্তর পড়েন যেখানে প্রো স্পষ্টভাবে কোনও প্রচেষ্টা না করে তারিখের ফর্ম্যাট ঘোষণা করুন, নবজাতককে ধরে নিতে হবে যে তাদের এটি নিয়ে চিন্তা করার দরকার নেই (বা এটি ডিবি সব সময় সঠিকভাবে পার্স করবে)
Caius Jard

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

3

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

কিন্তু

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

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

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

এখন কি?

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


1

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

ধরে নিই যে " স্ট্রিংস হ্যাঁ " এর মধ্যে "তারিখগুলি" কাছাকাছি চলেছে ; আমি একেবারে সম্মত হই যে আপনি এই কাজটি ঠিক করেছেন।

যখন হয় "01/04/07"?
* ৪ জানুয়ারী?
* এপ্রিল 1 ম?
* April ই এপ্রিল [2001]?

"কম্পিউটার" তাদের ব্যাখ্যা কীভাবে বেছে নেয় তার উপর নির্ভর করে এগুলির যে কোনও বা সমস্তই সঠিক হতে পারে।

আপনি যদি আছে তাদের মধ্যে লিটারেল সঙ্গে গতিশীল এসকিউএল, গড়ে তুলতে তারপর আপনার তারিখ বিন্যাস ভালভাবে সংজ্ঞায়িত করা এবং, বিশেষ করে, মেশিন স্বাধীন (আমি একটি উইন্ডোজ সার্ভার উপর একটি অদ্ভুত এক যেখানে উইন্ডোজ পরিষেবা মধ্যে তারিখ ভিত্তিক প্রক্রিয়াকরণ টেরা গিয়েছিলাম ছিল কারণ কোনও অপারেটর বিভিন্ন তারিখের ফর্ম্যাট পছন্দগুলি সহ কনসোলে লগইন করেছেন!)। ব্যক্তিগতভাবে, আমি একচেটিয়াভাবে [d] "yyyy-mm-dd" ফর্ম্যাটটি ব্যবহার করি।

যাহোক ...

সেরা সমাধান ব্যবহার করতে Parameterised ক্যোয়ারী যা ডাটা টাইপ বাধ্য রূপান্তরিত করা হয় আগে এসকিউএল জড়িত পায় - একটি "তারিখ" মান একটি মধ্যে পেয়ে তারিখ ভোরে টাইপ রূপান্তর প্যারামিটার বাহিনী (এটা বিশুদ্ধরূপে একটি কোডিং সমস্যা উপার্জন, একটি SQL এক নয়) ।


আমি সম্মত, যদিও একই সমস্যাটি প্যারামিটারাইজড ক্যোয়ারীগুলি দিয়ে আবার জোর করা যেতে পারে, WHERE datecolumn = @dateParameterতারপরে এবং তারপরে সামনের শেষের কোডে, ডিবি ড্রাইভারকে যেটি @dateParameterবার্চার টাইপযুক্ত "01/04/07"তা বলে এবং এতে লেগে থাকা । আমার প্রশ্নের মূল অনুপ্রেরণা হ'ল আমি সন্দেহ করি যে যে কেউ আমাকে বলবে যে আমি একজন প্যারামিটারাইজড ক্যোয়ারী করার জন্য পাগল হয়েছি, একই শ্বাস-প্রশ্বাসে, এমন এক লাইন এসও উত্তর দেবে যা দেখে মনে হয় WHERE datecol = 'some string that looks like a date'(এবং আশা করি কোনও নবজাতকের জানা উচিত) সমস্যাগুলি এড়াতে এটি কেবল একটি ইঙ্গিত / প্যারামিটারাইজ করুন)
Caius Jard
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.