আরাকল ডেটটাইম কোথায় ক্লজ?


84

আমার এর মতো স্ক্যুয়াল কিছু আছে:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> এটি 10 ​​টি সারি এবং TIME_CREATED = '26 -JAN-2011 'দেয়

এখন যখন আমি এটি করি আমি কোনও সারি ফিরে পাই না,

SELECT EMP_NAME, DEPT
    FROM EMPLOYEE
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> আউট চেয়ে বড় গ্রহণ

কোন কারণে কেন?


4
আপনার ভাষা নির্ভর তারিখের ফর্ম্যাটগুলি এড়ানো উচিত। যা বিভিন্ন সিস্টেমে সমস্যা সৃষ্টি করতে পারে। আপনার কোডটি কোনও সিস্টেমে সমস্যা ছাড়াই চলেছে কিনা তা নিশ্চিত করার জন্য আপনার (প্লাস অবশ্যই অ্যাপোরিয়েট ফর্ম্যাট) 01পরিবর্তে ব্যবহার করা উচিত JAN
a_horse_with_no_name

উত্তর:


149

হ্যাঁ: TIME_CREATED এ একটি তারিখ এবং একটি সময় রয়েছেTRUNCসময় কাটাতে ব্যবহার করুন :

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

আপডেট:
ডেভ কোস্টা নীচের মন্তব্যে যেমন উল্লেখ করেছেন, এটি অরাকল TIME_CREATEDযদি বিদ্যমান থাকে তবে কলামটির সূচি ব্যবহার করতে বাধা দেবে । এই সমস্যা ব্যতীত বিকল্প পদ্ধতি হ'ল:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1

14
মনে রাখবেন যে এই পদ্ধতির উপস্থিতি থাকলে TIME_CREATED এ কোনও সূচক ব্যবহারকে আটকাবে।
ডেভ কোস্টা

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

কেন ব্যবহার BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1করবেন না ?
আজিহ

4
@ আজেহ: betweenঅস্পষ্টতার কারণে আমি পছন্দ করি না । মনে হচ্ছে এটি যখন সীমাবদ্ধ তখন যখন এটি অন্তর্ভুক্ত থাকে lusive এজন্যই আমি এড়িয়ে চলেছি। তদতিরিক্ত, এই কংক্রিট উদাহরণে, এটি একই হবে না।
ড্যানিয়েল হিলগারথ

28

আপনার ক্যোয়ারিতে TIME অংশটি অন্তর্ভুক্ত করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');


7

কারণ DATEওরাকলে একটি কলামেও একটি সময় অংশ থাকে। to_date()ফাংশনটির ফলাফলটি নির্ধারিত সময় সহ একটি তারিখ 00:00:00এবং সুতরাং এটি সম্ভবত টেবিলের কোনও সারিটির সাথে মেলে না।

আপনার ব্যবহার করা উচিত:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

5

অন্যান্য লোকেরা যেমন উপরে মন্তব্য করেছেন, TRUNC ব্যবহার করা সূচিগুলির ব্যবহারকে বাধা দেবে (যদি TIME_CREATED তে কোনও সূচি থাকে)। সমস্যাটি এড়াতে, ক্যোয়ারীটি কাঠামো হিসাবে তৈরি করা যেতে পারে

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
            AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;

86399 এক দিনের সেকেন্ডের সংখ্যার চেয়ে 1 সেকেন্ড কম।

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