আমার দুটি টেবিল রয়েছে যেখানে কলামটি [date]
টাইপ DATETIME2(0)
।
আমাকে কেবলমাত্র তাদের তারিখের অংশগুলি (দিন + মাস + বছর) দ্বারা সময় রেকর্ডগুলি (ঘন্টা + মিনিট + সেকেন্ড) ত্যাগ করে দুটি রেকর্ড তুলনা করতে হবে।
আমি এটা কিভাবে করবো?
আমার দুটি টেবিল রয়েছে যেখানে কলামটি [date]
টাইপ DATETIME2(0)
।
আমাকে কেবলমাত্র তাদের তারিখের অংশগুলি (দিন + মাস + বছর) দ্বারা সময় রেকর্ডগুলি (ঘন্টা + মিনিট + সেকেন্ড) ত্যাগ করে দুটি রেকর্ড তুলনা করতে হবে।
আমি এটা কিভাবে করবো?
উত্তর:
মার্কের উত্তরের একটি ছোট্ট অসুবিধা হ'ল উভয় ডেটফিল্ড টাইপকাস্ট হয়েছে, যার অর্থ আপনি কোনও সূচী লাভ করতে অক্ষম হবেন।
সুতরাং, যদি এমন কোনও কোয়েরি লেখার প্রয়োজন হয় যা কোনও তারিখের ক্ষেত্রের সূচক থেকে উপকৃত হতে পারে তবে নিম্নলিখিত (বরং সংশ্লেষিত) পদ্ধতির প্রয়োজন।
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: কেবল তারিখটি উত্তোলনের আরেকটি উপায় (এসকিউএল সার্ভারের পুরানো সংস্করণগুলিতে) হ'ল তারিখটি অভ্যন্তরীণভাবে কীভাবে উপস্থাপিত হয় তা একটি কৌশল ব্যবহার করা।
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
যদিও আমি উত্তরটিকে সঠিক হিসাবে চিহ্নিত করে আপবোট করেছি। যে কেউ এ নিয়ে হোঁচট খাচ্ছে তার জন্য আমি কয়েকটি বিষয় স্পর্শ করতে চেয়েছিলাম।
সাধারণভাবে, যদি আপনি একা তারিখের মানগুলিতে বিশেষভাবে ফিল্টার করছেন । মাইক্রোসফ্ট ymd
বা এর ভাষা নিরপেক্ষ বিন্যাস ব্যবহার করার পরামর্শ দেয় y-m-d
।
নোট করুন যে ফর্ম '2007-02-12' কেবলমাত্র DATE, DATETIME2, এবং DATETIMEOFFSET ডেটা ধরণের জন্য ভাষা-নিরপেক্ষ হিসাবে বিবেচিত হয়।
পূর্বোক্ত পদ্ধতির ব্যবহার করে একটি তারিখ তুলনা করা সহজ। নিম্নলিখিত, স্বীকৃত উদাহরণ বিবেচনা করুন।
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
নিখুঁত বিশ্বে, ফিল্টারকৃত কলামে যে কোনও ম্যানিপুলেশন সম্পাদন করা এড়ানো উচিত কারণ এটি এসকিউএল সার্ভারকে দক্ষতার সাথে সূচীগুলি ব্যবহার করতে বাধা দিতে পারে। এটি বলেছে যে, আপনি যে ডেটা সংরক্ষণ করছেন তা যদি কেবলমাত্র তারিখের সাথে সম্পর্কিত এবং সময় নয় তবে সময় হিসাবে DATETIME
মধ্যরাতের মতো সংরক্ষণ করার বিষয়টি বিবেচনা করুন । কারণ:
এসকিউএল সার্ভার যখন আক্ষরিককে ফিল্টারকৃত কলামের ধরণের রূপান্তরিত করে, তখন কোনও মধ্যবর্তী অংশ নির্দেশিত না হলে মধ্যরাত ধরে নেয়। আপনি যদি নির্দিষ্ট তারিখ থেকে এই ধরণের ফিল্টারটি সমস্ত সারি ফিরিয়ে আনতে চান তবে আপনাকে নিশ্চিত করতে হবে যে সময় হিসাবে আপনি মধ্যরাতের সাথে সমস্ত মান সঞ্চিত করেন।
সুতরাং, ধরে নিচ্ছেন যে আপনি কেবল তারিখের সাথেই উদ্বিগ্ন এবং আপনার ডেটা সংরক্ষণ করুন। উপরের প্রশ্নটি এখানে সরল করা যেতে পারে:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
আপনি এটি চেষ্টা করতে পারেন
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
আমি এমএস এসকিউএল 2014 এর জন্য কোডটি অনুসরণ করে এটি পরীক্ষা করি
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
এমএম / ডিডি / ওয়াইওয়াইওয়াই থেকে এমএম / ডিডি / ওয়াইওয়াইওয়াইয়ের মতো দুটি তারিখের তুলনা করুন । মনে রাখবেন প্রথম জিনিসটির কলামের ধরণের ক্ষেত্র অবশ্যই ডেটটাইম হতে হবে। উদাহরণ: columnname: PAYMENT_DATE ডাটাটাইপ: তারিখসময় ।
এর পরে আপনি এটি সহজেই তুলনা করতে পারেন। প্রশ্নটি হ'ল:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
এটা খুব সহজ ...... এটি পরীক্ষা করে .....