তারিখের ব্যাপ্তিগুলির মধ্যে পোস্টগ্রেস্কল ক্যোয়ারী


126

আমি আমার পোস্টগ্রেস্কএল ডিবিকে ফলাফলটি ফিরে পেতে জিজ্ঞাসা করার চেষ্টা করছি যেখানে কোনও নির্দিষ্ট মাস এবং বছর থাকে। অন্য কথায় আমি এক মাসের জন্য সমস্ত মান চাই।

আমি এখন পর্যন্ত এটি করতে সক্ষম হয়েছি এমন এক উপায়:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'

এটির সাথে সমস্যাটি হ'ল আমাকে টেবিলটি জিজ্ঞাসা করার আগে প্রথম তারিখ এবং শেষ তারিখ গণনা করতে হবে। এটি করার একটি সহজ উপায় আছে?

ধন্যবাদ


ব্যবধানটি কি সর্বদা এক মাস বা এটি হতে পারে, আপনি সম্ভবত 15 তম থেকে শুরু করে পরবর্তী মাসের 7 তারিখে শেষ করবেন?
ফ্রিল্যান

উত্তর:


202

তারিখগুলি (এবং সময়) দিয়ে আপনি যদি ব্যবহার করেন তবে অনেক কিছুই সহজ হয়ে যায় >= start AND < end

উদাহরণ স্বরূপ:

SELECT
  user_id
FROM
  user_logs
WHERE
      login_date >= '2014-02-01'
  AND login_date <  '2014-03-01'

এই ক্ষেত্রে আপনার এখনও আপনার প্রয়োজন মাসের শুরুর তারিখ গণনা করা দরকার তবে এটি যে কোনও উপায়ে সরাসরি এগিয়ে থাকা উচিত।

শেষের তারিখটিও সরল করা হয়েছে; ঠিক এক মাস যোগ করুন। 28 তম, 30, 31, ইত্যাদি নিয়ে গোলযোগ নেই


এই কাঠামোর সূচকগুলির ব্যবহার বজায় রাখতে সক্ষম হওয়ার সুবিধাও রয়েছে।


অনেক লোক নীচের মতো কোনও ফর্মের পরামর্শ দিতে পারে তবে তারা সূচি ব্যবহার করে না :

WHERE
      DATEPART('year',  login_date) = 2014
  AND DATEPART('month', login_date) = 2

এটিতে টেবিলের প্রতিটি একক সারির শর্তগুলি গণনা করা হয় (একটি স্ক্যান) এবং সারিগুলির সীমাটি মিলবে (একটি সীমা-সন্ধান) সন্ধান করতে সূচি ব্যবহার না করা।


1
প্রথম পদ্ধতির মাস (দিনের পরিবর্তে) এফ.এক্স. দিয়ে জগাখিচুড়ি করতে হবে। 2014-12-01এবং 2015-01-01। দ্বিতীয়টিও সূচকযুক্ত করা যেতে পারে, তবে এটি তুচ্ছ নয়, আমি স্বীকার করি - EXTRACT()আরও তুলনামূলক মনে হয়।
8.3

1
বিরতি ব্যবহার করে আপনি আপনার আবেদনের তারিখ গণনা এড়াতে পারবেন। উদাহরণস্বরূপ: WHERE login_date> = '2014-02-01' এবং login_date <'2014-02-01' :: তারিখ + ইন্টারভাল '1 মাস' আপনার কোডটি সরল করার সময় এটি এখনও সূচি ব্যবহার করে।
বাসওয়েল

53

পোস্ট্রেএসকিউএল থেকে 9.2 রেঞ্জের প্রকারগুলি সমর্থিত। সুতরাং আপনি এটি লিখতে পারেন:

SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date

স্ট্রিং তুলনার তুলনায় এটি আরও দক্ষ হওয়া উচিত


22

যদি কেউ এখানে অবতরণ করেন তবে 8.1 এর পরে আপনি কেবল ব্যবহার করতে পারেন:

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'

ডক্স থেকে:

দু'দিকের সিনমিট্রিক হ'ল বিটউইইন সমান, বাদে আর বাম দিকে যুক্তিটি ডানদিকে যুক্তির চেয়ে কম বা সমান হওয়ার প্রয়োজন নেই requirement যদি তা না হয় তবে এই দুটি আর্গুমেন্ট স্বয়ংক্রিয়ভাবে অদলবদল করা হয়, যাতে সর্বদা একটি সর্বদা বিস্তৃত থাকে।


-1
SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-03-01'

কীওয়ার্ডের মধ্যে একটি তারিখ ব্যতিক্রমীভাবে কাজ করে। এটি ধরে নেয় সময়গুলি তারিখের জন্য 00:00:00 (অর্থাৎ মধ্যরাত))


-14

ডকুমেন্টেশন পড়ুন।

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

আমি এর মতো একটি ক্যোয়ারী ব্যবহার করেছি:

WHERE
(
    date_trunc('day',table1.date_eval) = '2015-02-09'
)

অথবা

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')    

জুয়ানিটোস ইনজিনিয়ার।


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