ওরাকল এসকিউএলে তারিখের তুলনা করা


141

আমি এটি 20 জুন, 1994 এর পরে নিয়োগপ্রাপ্ত কর্মচারীর সংখ্যা প্রদর্শনের জন্য চেষ্টা করার চেষ্টা করছি, তবে "JUN 'অবৈধ শনাক্তকারী বলে আমি একটি ত্রুটি পেয়েছি Please দয়া করে সহায়তা করুন, ধন্যবাদ!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 

1
উল্লেখ্য যে আপনি ব্যবহার করতে পারেন পারেন > <বাBETWEEN '' AND ''
অ্যান্ড্রু

উত্তর:


296

31-DEC-95একটি স্ট্রিং না, হয় না 20-JUN-94। তারা শেষে যুক্ত কিছু অতিরিক্ত স্টাফ সহ নম্বর numbers এটি হতে পারে '31-DEC-95'বা '20-JUN-94'- একক উদ্ধৃতি নোট করুন ',। এটি আপনাকে একটি স্ট্রিং তুলনা করতে সক্ষম করবে।

তবে, আপনি একটি স্ট্রিং তুলনা করছেন না; আপনি একটি তারিখ তুলনা করছেন । আপনার স্ট্রিংকে একটি তারিখে রূপান্তর করা উচিত। হয় অন্তর্নির্মিত TO_DATE()ফাংশন, বা একটি তারিখ আক্ষরিক ব্যবহার করে

এখন পর্যন্ত()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

এই পদ্ধতির কয়েকটি অপ্রয়োজনীয় সমস্যা রয়েছে

  • মন্তব্যগুলিতে একটি_ ঘোড়া_বিহীন_নাম_নাম হিসাবে উল্লিখিত DEC, অগত্যা ডিসেম্বর মানেই হয় না। এটি আপনার NLS_DATE_LANGUAGEএবং NLS_DATE_FORMATসেটিংসের উপর নির্ভর করে । কোনও লোকালে কাজের সাথে আপনার তুলনা আপনি তার পরিবর্তে ডেটটাইম ফর্ম্যাট মডেলটি ব্যবহার করতে পারেন তা নিশ্চিত করতেMM
  • '95 বছর অবাস্তব। আপনি জানেন যে আপনি 1995 বোঝাতে চেয়েছিলেন তবে এটি '50, 1950 বা 2050 হলে কী হবে? স্পষ্ট হওয়া সর্বদা সেরা best
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

তারিখ আক্ষরিক

একটি তারিখের আক্ষরিকতা এএনএসআই স্ট্যান্ডার্ডের একটি অংশ, যার অর্থ আপনার কোনও ওরাকল নির্দিষ্ট ফাংশন ব্যবহার করতে হবে না। আক্ষরিক ব্যবহার করার সময় আপনাকে অবশ্যই ফর্ম্যাটে আপনার তারিখ নির্দিষ্ট করতে হবেYYYY-MM-DD এবং আপনি কোনও সময় উপাদান অন্তর্ভুক্ত করতে পারবেন না।

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

মনে রাখবেন যে ওরাকল তারিখের ডেটাটাইপটিতে একটি সময়ের এলিমেন্ট অন্তর্ভুক্ত রয়েছে, সুতরাং সময় অংশ ছাড়া তারিখ সমান 1995-12-31 00:00:00

আপনি যদি কোনও সময়ের অংশ অন্তর্ভুক্ত করতে চান তবে আপনাকে একটি টাইমস্ট্যাম্প আক্ষরিক ব্যবহার করতে হবে, যা বিন্যাসটি গ্রহণ করে YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

আরো তথ্য

NLS_DATE_LANGUAGEথেকে প্রাপ্ত NLS_LANGUAGEএবং NLS_DATE_FORMATথেকে প্রাপ্ত NLS_TERRITORY। এগুলি সেট করা হয় যখন আপনি প্রাথমিকভাবে ডাটাবেস তৈরি করেছিলেন তবে সেগুলি আপনার ইনিয়েলাইজেশন পরামিতি ফাইল পরিবর্তন করে পরিবর্তন করা যেতে পারে - কেবলমাত্র যদি প্রয়োজন হয় - বা ALTER SESSIONসিনট্যাক্স ব্যবহার করে সেশন পর্যায়ে । এই ক্ষেত্রে:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

এর অর্থ:

  • DD মাসের সাংখ্যিক দিন, 1 - 31
  • MM বছরের সংখ্যাগত মাস, 01 - 12 (জানুয়ারী 01)
  • YYYY4 ডিজিটের বছর - আমার মতে এটি 2 ডিজিট বছরের চেয়ে সর্বদা ভাল YYকারণ আপনি যে শতাব্দীর কথা উল্লেখ করছেন তাতে কোনও বিভ্রান্তি নেই।
  • HH24 দিনের ঘন্টা, 0 - 23
  • MI ঘন্টা মিনিট, 0 - 59
  • SS মিনিটের দ্বিতীয়, 0-59

আপনি অনুসন্ধানের মাধ্যমে আপনার বর্তমান ভাষা এবং তারিখের ভাষা সেটিংস V$NLS_PARAMETERSsএবং বৈধ মানগুলির সম্পূর্ণ সন্ধানটি জিজ্ঞাসা করে খুঁজে পেতে পারেন V$NLS_VALID_VALUES

আরও পড়া


ঘটনাক্রমে, আপনি চাইলে আপনার count(*)দ্বারা ভাগ করে নেওয়া উচিতemployee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

এটি আপনাকে প্রতি গণনা দেয় employee_id


13
টু_ডেট () তে ফর্ম্যাট মাস্ক ব্যবহার করার জন্য +1। মনে রাখবেন যে ভিন্ন ভাষা সেটিংয়ের কারণে এটি এখনও ভিন্ন পরিবেশে ব্যর্থ হতে পারে। DECঅগত্যা সবসময় একটি বৈধ মাস নয়। নামের পরিবর্তে সংখ্যা ব্যবহার করা সাধারণত ভাল
a_horse_with_no_name

1
আপনি একটি এএনএসআই আক্ষরিকের সাথে একটি সময় নির্দিষ্ট করতে পারেন - আপনাকে কেবল timestampআক্ষরিকের পরিবর্তে একটি আক্ষরিক নির্দিষ্ট করতে হবে date: timestamp '2015-01-30 19:42:04' (কারণ এএনএসআই এসকিউএল-তে কোনও dateডেটা টাইপের সময় হয় না, কেবল timestampডেটা টাইপ থাকে))
a_horse_with_no_name

1
এএনএসআই তারিখের আক্ষরিকাগুলি প্রতিবার TO_DATE এবং তারিখ-ফর্ম্যাট টাইপ করার সাথে তুলনা করা একটি সংক্ষিপ্ত উপায়। আমার মতো অলস বিকাশকারীদের পক্ষে ভাল । একটি বিষয় লক্ষ্য করার DATE 2016-04-01অর্থ 2016-04-01 00:00:00সত্যই। এবং আমি মনে করি এই সিনট্যাক্সটি ওরাকল 9 আই থেকে এইভাবে কাজ করে যেখানে এএনএসআই-এসকিউএল সিন্ট্যাক্সটি ওরাকলে প্রবর্তিত হয়েছিল।
লিওন - হ্যান লি

1
আমার চিন্তাভাবনা গত 4 বছরে উল্লেখযোগ্যভাবে বিকশিত হয়েছে @ লিওন :-) 'আমি উত্তরটি আপডেট করেছি। আমি উল্লেখ করেছি যে কোনও তারিখের আক্ষরিক একটি সময় উপাদানকে অন্তর্ভুক্ত করে না তবে আমি যা বলেছি সেটিকে আরও স্পষ্ট করে বলেছি। 9i প্রসারিত সমর্থন প্রায় 6 বছর আগে শেষ হয়েছিল ... এবং 14 বছর আগে মুক্তি পেয়েছিল। এটি বিশাল সংখ্যক ব্যবহারকারীর জন্য প্রাসঙ্গিক হওয়া উচিত নয়।
বেন


6

উপসংহার

to_char নিজস্ব উপায়ে কাজ করে

সুতরাং,

এমএম-ডিডি-ওয়াই বা ডিডি-এমএম-ওয়াইওয়াই বা অন্য কোনও ফর্ম্যাটের পরিবর্তে তুলনা করার জন্য সর্বদা এই বিন্যাসটি YYYY-MM-DD ব্যবহার করুন


4

আপনি ট্রাঙ্ক এবং টু ডেট ব্যবহার করতে পারেন:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;

2

আপনার জিজ্ঞাসা থেকে:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 

আমি মনে করি এটি 20 জুন, 1994 এর পরে নিয়োগপ্রাপ্ত কর্মচারীর সংখ্যা প্রদর্শন করবে না you আপনি যদি কর্মীদের সংখ্যা দেখাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

আপনি যে তারিখগুলি ব্যবহার করতে পারেন তার তুলনায় সেরা অনুশীলনের জন্য আমি মনে করি:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;

-4

একক উদ্ধৃতি অবশ্যই সেখানে থাকতে হবে, যেহেতু তারিখটি চরিত্রে রূপান্তরিত হয়েছে।

কর্মী_আইড, গণনা (*) নির্বাচন করুন
কর্মচারী থেকে
যেখানে_চর (কর্মচারী_সামান্য_হিরে, 'ডিডি-মন-ওয়াই')> '31 -DEC-95 ';

1
এই এসকিউএল একটি অন্তর্নিহিত তারিখ বিন্যাস ব্যবহার করে, এটি সর্বদা কার্যকর হবে না।
জন হেলার

5
এটি কেবলমাত্র আপনার নির্দিষ্ট এনএলএস_ * সেটিংসের জন্য কাজ করছে, এটি অন্য ক্লায়েন্ট বা সার্ভারে কাজ নাও করতে পারে। স্বীকৃত উত্তর ব্যাখ্যা করে যে একটি সুস্পষ্ট তারিখের বিন্যাস কেন গুরুত্বপূর্ণ।
জন হেলার

এই পদ্ধতিটি তারিখের সাথে নয়, স্ট্রিংগুলির সাথে তুলনা করছে। দ্বিতীয় স্ট্রিংটি "3" দিয়ে শুরু হয়, সুতরাং তুলনাটি "বর্ণানুক্রমিক ক্রম" এর মতো কাজ করে। মজার বিষয় হচ্ছে, আপনি যদি YYYY-MM-DD এর মতো ফর্ম্যাট ব্যবহার করেন তবে এই ধরণের তুলনাটি আসলে (দুর্ঘটনা অনুসারে বাছাই করা) কাজ করে। তবে অবশ্যই তারিখের সাথে তারিখের তুলনা করা ভাল ...
নিক পার্কিনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.