সময়ের অংশটিকে উপেক্ষা করে DATETIME এবং DATE এর সাথে তুলনা করুন


151

আমার দুটি টেবিল রয়েছে যেখানে কলামটি [date]টাইপ DATETIME2(0)

আমাকে কেবলমাত্র তাদের তারিখের অংশগুলি (দিন + মাস + বছর) দ্বারা সময় রেকর্ডগুলি (ঘন্টা + মিনিট + সেকেন্ড) ত্যাগ করে দুটি রেকর্ড তুলনা করতে হবে।

আমি এটা কিভাবে করবো?

উত্তর:


252

ব্যবহার করুন CASTনতুন DATEমাত্র তারিখ অংশ তুলনা করতে SQL সার্ভার 2008 সালে ডেটা টাইপ:

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

61

মার্কের উত্তরের একটি ছোট্ট অসুবিধা হ'ল উভয় ডেটফিল্ড টাইপকাস্ট হয়েছে, যার অর্থ আপনি কোনও সূচী লাভ করতে অক্ষম হবেন।

সুতরাং, যদি এমন কোনও কোয়েরি লেখার প্রয়োজন হয় যা কোনও তারিখের ক্ষেত্রের সূচক থেকে উপকৃত হতে পারে তবে নিম্নলিখিত (বরং সংশ্লেষিত) পদ্ধতির প্রয়োজন।

  • ইনডেক্সড ডেটফিল্ড (এটিকে ডিএফ 1 কল করুন) অবশ্যই কোনও ধরণের ক্রিয়াকলাপ দ্বারা অচ্ছুত হতে হবে।
  • সুতরাং আপনাকে ডিএফ 2 দিনের জন্য ডেটটাইম মানগুলির সম্পূর্ণ পরিসরের সাথে ডিএফ 1 টি তুলনা করতে হবে।
  • এটি ডিএফ 2 এর তারিখের অংশ থেকে ডিএফ 2 এর পরের দিনের তারিখের অংশ পর্যন্ত।
  • অর্থাত (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • দ্রষ্টব্য : এটি অত্যন্ত গুরুত্বপূর্ণ যে তুলনাটি ডি = 2 এর তারিখের সাথে > = (সমতা অনুমোদিত) এবং (কড়াভাবে) < ডিএফ 2 এর পরের দিন। এছাড়াও বিটউইউইন অপারেটর কাজ করে না কারণ এটি উভয় পক্ষে সমতার অনুমতি দেয়।

PS: কেবল তারিখটি উত্তোলনের আরেকটি উপায় (এসকিউএল সার্ভারের পুরানো সংস্করণগুলিতে) হ'ল তারিখটি অভ্যন্তরীণভাবে কীভাবে উপস্থাপিত হয় তা একটি কৌশল ব্যবহার করা।

  • ভাসা হিসাবে তারিখটি কাস্ট করুন।
  • ভগ্নাংশের অংশ কেটে ফেলুন
  • তারিখের সময়টিতে মানটি কাস্ট করুন
  • অর্থাত CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

যদিও আমি উত্তরটিকে সঠিক হিসাবে চিহ্নিত করে আপবোট করেছি। যে কেউ এ নিয়ে হোঁচট খাচ্ছে তার জন্য আমি কয়েকটি বিষয় স্পর্শ করতে চেয়েছিলাম।

সাধারণভাবে, যদি আপনি একা তারিখের মানগুলিতে বিশেষভাবে ফিল্টার করছেন । মাইক্রোসফ্ট 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

3

আপনি এটি চেষ্টা করতে পারেন

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

-3

এমএম / ডিডি / ওয়াইওয়াইওয়াই থেকে এমএম / ডিডি / ওয়াইওয়াইওয়াইয়ের মতো দুটি তারিখের তুলনা করুন । মনে রাখবেন প্রথম জিনিসটির কলামের ধরণের ক্ষেত্র অবশ্যই ডেটটাইম হতে হবে। উদাহরণ: columnname: PAYMENT_DATE ডাটাটাইপ: তারিখসময়

এর পরে আপনি এটি সহজেই তুলনা করতে পারেন। প্রশ্নটি হ'ল:

select  *  from demo_date where date >= '3/1/2015' and date <=  '3/31/2015'.

এটা খুব সহজ ...... এটি পরীক্ষা করে .....


এটি প্রশ্নের পুরোপুরি উত্তর দেয় না। এটি এক মাস নয়, এক মাসের জন্য অনুসন্ধান করে।
কার্টিস ইয়ালাপ

আপনার মার্চ ক্যোয়ারির জন্য: তারিখটি যদি '3/31/2015' সময় 13:00 হয়, এটি পাওয়া যাবে না। আপনার <'4/1/2015' ব্যবহার করা উচিত।
কার্টিস ইয়ালাপ

'2015-03-01' আন্তর্জাতিক তারিখের ফর্ম্যাটটি ব্যবহার করে বিবেচনা করুন। কানাডায় (এবং অন্যান্য অনেক জায়গায়) একটি অফিসিয়াল ফর্ম্যাটটি ডিডি / এমএম / ওয়াইওয়াইওয়াই যা উভয় ফর্ম্যাটকে অস্পষ্ট এবং সমস্যাযুক্ত করে তোলে।
কার্টিস ইয়ালাপ

এই উত্তরটি 2 টি টেবিলের সাথে প্রশ্নে অনুরোধ করা হয়নি requested
কর্টিস ইয়ালাপ

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