দুটি তারিখের মধ্যে তারিখগুলি নির্বাচন করতে এসকিউএল কোয়েরি


303

আমি একটি start_dateএবং end_date। আমি এই দুটি তারিখের মধ্যে তারিখের তালিকা পেতে চাই। কেউ কি আমার জিজ্ঞাসায় ভুলটি নির্দেশ করতে সহায়তা করতে পারে?

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

এখানে Dateএকটি datetimeপরিবর্তনশীল।

উত্তর:


483

আপনার সেই দুটি তারিখের মত একক উদ্ধৃতিগুলির মধ্যে রাখা উচিত ..

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

বা ব্যবহার করতে পারেন

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'

মনে রাখবেন যে প্রথম তারিখটি অন্তর্ভুক্ত, তবে দ্বিতীয়টি একচেটিয়া, কারণ এটি কার্যকরভাবে '2011/02/27 00:00:00'


42
এসকিউএল সার্ভার 00:00:00 সময় ছাড়াই একটি তারিখ ডিফল্ট করে। তাহলে এই কোয়েরিটি 2011/02/25 এবং 2011/02/26 থেকে মধ্যরাতে কোনও কিছুই ফেরত দেবে না?
ম্যাট

5
@ প্রদীপ, আপনার দ্বিতীয় বিটটি>> এবং <=
ইন্দো নাইট

3
আপনি উল্লেখ করতে পারেন যে অর্ডারটি বিটউইউইন ফাংশনে গুরুত্বপূর্ণ। এটি বাম দিকে সবচেয়ে পুরানো থেকে ডানদিকে সাম্প্রতিকতম যেতে হবে। এটি = স্বরলিপি হিসাবে তুলনামূলক অপারেটর হিসাবে অপ্রয়োজনীয় এবং যেখানে দফাটিতে "কর্মচারী আইডি = 1" বা "1 = কর্মচারী আইডি" উভয়ের পক্ষে কাজ করে।
ফাই হোরান

@Matt জন্য ডকুমেন্টেশন অনুযায়ী মধ্যবর্তী , যদি একটি সারি একটি সময় ছাড়া 2011/02/27 তারিখ ছিল, তারপর যে সারি 2011/02/27 00:00 তারিখ থাকার সমতূল্য এবং প্রত্যাবর্তিত হবে না ক্যোয়ারী, কারণ এটি 2011/02/27 00:00 এর চেয়ে কম বা সমান। সুতরাং আপনি যদি সময়ের সাথে betweenকাজ করে না থাকেন তবে প্রত্যাশা অনুযায়ী কাজ করা উচিত।
টিমট্রটান

@ টিটম্যাকট্রান ডান, তবে ২০১১/০২/২০১ 00 00:00 আমরা 2011/02/26 এর মধ্যরাত কল করব। সম্ভবত, ক্যোয়ারির অর্থ ফলাফল নির্ধারিত 27 তম অন্তর্ভুক্ত করা উচিত - তবে 2011/02/27 5:00 এর টাইমস্ট্যাম্প সহ একটি এন্ট্রি অন্তর্ভুক্ত করা হবে না।
সিনজাই

128

যেহেতু একটি নির্দিষ্ট সময়ের বিভাগ ব্যতীত একটি ডেটটাইমের মান থাকবে date 00:00:00.000, আপনি যদি নিজের সীমাতে সমস্ত তারিখ পেয়েছেন তা নিশ্চিত করতে চান, আপনাকে অবশ্যই আপনার শেষের তারিখের জন্য সময় সরবরাহ করতে হবে বা আপনার শেষের তারিখ বাড়াতে হবে এবং ব্যবহার করতে হবে <

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'

অথবা

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28'

অথবা

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'

নিম্নলিখিতগুলি ব্যবহার করবেন না, কারণ এটির সময়গুলি 00: 00: 00.000 হলে 2011/02/28 থেকে কিছু রেকর্ড ফিরে আসতে পারে।

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28'

42
মানুষ এখনও এই প্রশ্ন এবং উত্তরগুলির দিকে তাকাচ্ছে, এমনকি যদি এগুলি প্রাথমিকভাবে কিছুক্ষণ আগে বলা হয়েছিল। আমি একটি উত্তর খুঁজছিলাম, এবং আমি এখানে যা দেখেছি তার বেশিরভাগই অসম্পূর্ণ বা একেবারেই ভুল। আমার উত্তরটি মূল পোস্টারটিকে সাহায্য করবে না তবে এটি কারওর পক্ষে, সম্ভবত এখন থেকে তিন বছর পরেও সহায়তা করবে।
ওয়েলশড্রেগন

3
আপনার উত্তর আমাকে খুব সাহায্য করেছে, @ ওয়েলশড্রেগন - অন্যান্য উত্তরগুলি এই সত্যটি এড়িয়ে যায় যে ঘন্টাটি উপেক্ষা করার জন্য সার্ভারে তারিখের ফর্ম্যাটটি "সাধারণ তারিখ" হওয়া দরকার। "<= END_DATE" 12 টা ধরে নেয়, যা আমি জানতাম না। আমি "... <= 01/01/2014" দিয়ে একটি কোয়েরি করছিলাম এবং আমি কেন তারিখের আদেশগুলি 1 ম এর জন্য প্রদর্শিত হচ্ছে না তা বুঝতে পারি না। আপনাকে অনেক ধন্যবাদ.
কিথ

@ ওয়েলশড্রাগন - আপনার উত্তরটি যেখানে ক্লজ হিসাবে তারিখগুলি ব্যবহারের জন্য খুব ভাল উপাদান। আপনাকে ধন্যবাদ
জ্যাক ফ্রস্ট

যদি ফিরে আসে তবে কী ভুল '2011/02/28 00:00:00.000'?
মুফ্লিক্স

1
আজ এটি চেষ্টা করে, আপনিও ব্যবহার করতে পারেন convert(date, Date) between '2011/02/25' and '2011/02/27'(কমপক্ষে সাম্প্রতিক কোনও এসএসকিউএল সার্ভার সহ)। convert()খন্ডকালীন অংশ stripping যত্ন নিতে হবে এবং তুলনা মধ্যে তারপর আশানুরূপ কাজ হবে।
জ্ঞান

14

এটা চেষ্টা কর:

select Date,TotalAllowance from Calculation where EmployeeId=1
             and [Date] between '2011/02/25' and '2011/02/27'

তারিখের মানগুলি স্ট্রিং হিসাবে টাইপ করা দরকার।

এসকিউএল সার্ভার ২০০৮ এবং এর চেয়ে উচ্চতর ক্ষেত্রে আপনার প্রশ্নের ভবিষ্যত-প্রমাণ করার জন্য, এড়ানো Dateউচিত কারণ এটি পরবর্তী সংস্করণগুলিতে একটি সংরক্ষিত শব্দ।

মনে রাখবেন যে সময় ব্যতীত তারিখগুলি মধ্যরাতকে তাদের ডিফল্ট হিসাবে গ্রহণ করে, সুতরাং সেখানে আপনার সঠিক মূল্য নাও থাকতে পারে।


1
তারিখ কোনও কীওয়ার্ড নয় এবং এড়াতে হবে না। সিনট্যাক্স হাইলাইটিং কেবল সিনট্যাক্স হাইলাইটিং, কীওয়ার্ডগুলি কেবল এড়িয়ে চলতে হবে যদি তারা সিন্ট্যাক্স ত্রুটির কারণ হয়ে থাকে। ডেটস্ট্রিং কনস্ট্যান্টের অন্তর্নিহিত রূপান্তর পরিবর্তে সুস্পষ্ট রূপান্তর ব্যবহার করাও একটি ভাল অনুশীলন। - এবং CAST ('2011/02 / 25'ASATATIME') এবং CAST ('2011/02 / 27'A তারিখ) এর মধ্যে তারিখ
tponthieux

5
এটি যদি এসকিউএল সার্ভার 2005 হয় তবে স্বাভাবিকভাবেই আপনি ঠিক আছেন, যা ওপি ট্যাগ করেছে। তবে, তারিখটি ২০০৮ এবং তার চেয়ে বেশি সংরক্ষিত, সুতরাং ভবিষ্যত-প্রুফিংয়ের জন্য, এটি থেকে বেরিয়ে আসার কোনও ক্ষতি নেই। আমি আমার উত্তর সম্পাদনা করেছি।

1
যদি সে উভয়ের জন্য একক তারিখ নির্দিষ্ট করে দেয় তবে এটি শূন্য সারিতে ফিরে আসবে তবে আমার ধারণা যে অপের প্রয়োজনীয়তা নেই
জো হ্যাজ

12
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

এখানে, বর্তমানের শেষ তারিখটিতে প্রথমে একটি দিন যুক্ত করুন, এটি হবে 2011-02-28 00:00:00, তারপরে আপনি শেষের তারিখটি তৈরি করতে এক সেকেন্ডটি বিয়োগ করুন 2011-02-27 23:59:59। এটি করে আপনি প্রদত্ত বিরতিগুলির মধ্যে সমস্ত তারিখ পেতে পারেন।

output:
2011/02/25
2011/02/26
2011/02/27


5

এই কোয়েরিটি বর্তমান তারিখ এবং এর পরবর্তী 3 তারিখের মধ্যে মানগুলি আনতে ভাল

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

এটি শেষ পর্যন্ত বর্তমান তারিখে অতিরিক্ত 3 দিনের বাফার যুক্ত করবে।


5

এটি অনেক পুরানো, তবে তারিখগুলির সাথে আমার অনেক অভিজ্ঞতা দেওয়া হয়েছে, আপনি এটি বিবেচনা করতে পারেন: লোকে বিভিন্ন আঞ্চলিক সেটিংস ব্যবহার করে, যেমন, কিছু লোক (এবং কিছু ডাটাবেস / কম্পিউটারগুলি আঞ্চলিক সেটিংসের উপর নির্ভর করে) এটি পড়তে পারে 11/12/2016 তারিখ 11 ডিসেম্বর 2016 বা 12 নভেম্বর, 2016. আরও বেশি, মাইএসকিউএল ডাটাবেসে সরবরাহিত 16/11/12 অভ্যন্তরীণভাবে 12 নভেম্বর 2016 তে রূপান্তরিত হবে, যখন যুক্তরাজ্যের আঞ্চলিক সেটিং কম্পিউটারে চলমান অ্যাক্সেস ডাটাবেস ব্যাখ্যা করবে এবং এটি 16 নভেম্বর 2012 হিসাবে সংরক্ষণ করুন।

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

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

আরও মনে রাখবেন যে অ্যাক্সেস এইভাবে # টি গ্রহণ করবে:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;

তবে এমএস এসকিউএল সার্ভারটি করবে না, তাই আমি সবসময় উপরে "" "ব্যবহার করি যা উভয় ডাটাবেসই গ্রহণ করে।

এবং কোডটিতে কোনও চলক থেকে সেই তারিখটি পাওয়ার পরে, আমি সর্বদা ফলাফলকে স্ট্রিংয়ে নিম্নরূপে রূপান্তর করি:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")

আমি এটি লিখছি কারণ আমি জানি কখনও কখনও কিছু প্রোগ্রামার অন্তর্নিহিত রূপান্তর সনাক্ত করতে যথেষ্ট আগ্রহী নাও হতে পারে। <13 তারিখের জন্য কোনও ত্রুটি থাকবে না, কেবল ভিন্ন ফলাফল!

প্রশ্ন করা প্রশ্ন হিসাবে, শেষ তারিখে একদিন যুক্ত করুন এবং তুলনাটি নিম্নরূপ করুন:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 

আপনার তথ্য আমার কাজ সম্পূর্ণ করতে সাহায্য করেছে। আমি এটির জন্য 10 ঘণ্টারও বেশি সময় ধরে কাজ করেছি এবং উত্তরগুলির উত্তর আমার পক্ষে কাজ করবে না। আপনি যখন আমার প্রকল্পটি দুর্দান্ত কাজ করে দেখিয়েছেন এমনভাবে আমি যখন যুক্তিযুক্ত হই। তবে নিয়মটি মনে হয় এটি কোনও এসকিউএল বিবৃতি লিখেনি। যখনই আমি এসকিউএল বিবৃতিতে তারিখের প্যারামিটারগুলি যুক্ত করার জন্য যখন এসকিউএলকম্যান্ডকে সেট করার চেষ্টা করি তখন প্যারামিটারগুলি সংযুক্ত হবে না এবং আমি ত্রুটি পেয়েছি যে আমাকে "@startDate" এবং "@endDate" ঘোষণা করতে হবে। আমি এই সমস্যাটি পাস করতে পারি না। আমি আপনার তারিখের ফর্ম্যাটটি "ডিডি এমএমএম ইয়াই" চেষ্টা করেছি যা আমি কাজ করেছিলাম এবং আমি "yyyy এমএমএম ডিডি" ব্যবহার করেছিলাম যা একই অভিনয় করেছিল।
ডেভ হাম্পেল

দুর্দান্ত এটি সাহায্য! উপরে কোডের নমুনা রয়েছে। এসকিউএল ইঞ্জেকশন এড়ানোর জন্য প্যারামিটারগুলি ঘোষণা করা এবং ব্যবহার করা সর্বদা ভাল। এবং মনে হচ্ছে আপনার প্রকল্পের নিয়মাবলী দ্বারা আপনার ইতিমধ্যে প্রয়োজনীয় / সুরক্ষিত রয়েছে যা ভাল।
হ্যানিংটন মামবো

4
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'

3

উদাহরণস্বরূপ # # এর মধ্যে তারিখগুলি রাখার চেষ্টা করুন

#2013/4/4# and #2013/4/20#

এটা আমার জন্য কাজ করেছে।


1
এই প্রসঙ্গে # কী করে?
বি কে

@ বি কে এটি স্ট্রিমের জন্য উদ্ধৃতি চিহ্নের মতো একটি সীমান্তকারক। "যখন কোনও এসকিউএল বিবৃতিতে মান সরবরাহ করা হয়, উদাহরণস্বরূপ ক্যোয়ারী মানদণ্ড হিসাবে, তাদের ডেটা টাইপটি অবশ্যই একটি" যোগ্যতা অর্জনকারী "দ্বারা সংজ্ঞায়িত করা উচিত appropriate এটি উপযুক্ত অক্ষরের জোড়ার মধ্যে মানটি আবদ্ধ করে করা হয়" " রেফারেন্স -> লিংক
Aleksandar

1
@ বি কে যদি এটি টিএসকিউএল সিনট্যাক্স হয় তবে আপনার যা প্রয়োজন তা পেতে আপনাকে একক উদ্ধৃতি চিহ্ন ( ' ) ব্যবহার করতে হবে। রেফারেন্সস * বুনিয়াদি sql-foutstuff.com * সূচনা এসকিউএল - পল উইল্টন, জন কলবি
আলেকসান্দার

1
এটি আরও পরিষ্কার হতে পারে না যে প্রশ্নটি এসকিউএল সার্ভার এবং টি-এসকিউএল এর জন্য। টি-এসকিউএল এবং এসকিউএল সার্ভার হ্যাশ ট্যাগের মধ্যে তারিখগুলি গ্রহণ করে না, এটি একক উদ্ধৃতিগুলির মধ্যে তারিখগুলি গ্রহণ করে। এই উত্তরটি ভুল।
টিটি।

@TT। upvotes এর সংখ্যা বলে যে এটি এখনও কাউকে সাহায্য করেছে। আমি আমার উত্তরটি যখন লিখেছিলাম তখন গ্রহণযোগ্য উত্তরটি ইতিমধ্যে বেছে নেওয়া হয়েছিল। তবুও, গুগল বা অন্য কোথাও যে কেউ এখানে আসতে পারে তাদের সহায়তা করার জন্য আমি এটি লিখেছিলাম :)
আলেকসান্দার

2

এটির তারিখ যদি 24 ঘন্টা হয় এবং সকালে শুরু হয় এবং রাতে শেষ হয় তবে এর মতো কিছু যুক্ত করা উচিত:

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'

1

বর্তমান তারিখ এবং তিন দিনের মধ্যে নির্বাচনের তারিখের জন্য সেরা ক্যোয়ারী :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN       
DATE_SUB(CURDATE(), INTERVAL 3 DAY)  AND CURDATE() 

বর্তমান তারিখ এবং পরবর্তী তিন দিনের মধ্যে নির্বাচনের তারিখের জন্য সেরা কোয়েরি :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN   
   CURDATE()  AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)   

1

নীচের উদাহরণগুলি দেখুন: উভয় কর্মক্ষম এবং অ-কার্যকরী।

select * from tblUser Where    
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**

অথবা

select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**

অথবা

select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working**

এবং নীচে কাজ করছে না:

select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >=  Convert(Varchar(10),'01-01-2015',111) and  Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**


select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**

1

আমরা দুটি তারিখের ডেটা দেখানোর জন্য ব্যবহার করতে পারি তবে এটি পুরো ডেটা অনুসন্ধান করবে এবং তুলনা করবে যাতে এটি বিশাল ডেটার জন্য আমাদের প্রক্রিয়াটি ধীর করে দেয়, তাই আমি সবাইকে ব্যবহার করার পরামর্শ দিচ্ছি datediff:

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

এখানে ক্যালেন্ডার হ'ল সারণী, সূচনা তারিখের পরিবর্তনশীল হিসাবে dt এবং dt2 সমাপ্তি তারিখের পরিবর্তনশীল।


0

আমি পূর্বের তারিখগুলির জন্য '1 মাসের নাম 2015' সিনট্যাক্সটি ব্যবহার করতে চাই:

   WHERE aa.AuditDate>='1 September 2015'
     AND aa.AuditDate<='30 September 2015'

তারিখের জন্য


0

আমি যেতে হবে

select Date,TotalAllowance from Calculation where EmployeeId=1
             and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')

যুক্তি সত্তা যাতে >=সম্পূর্ণ শুরুর তারিখ <অন্তর্ভুক্ত থাকে এবং শেষের তারিখটি বাদ দেয় তাই আমরা শেষের তারিখে একটি ইউনিট যুক্ত করি। এটি কয়েক মাস ধরে খাপ খাইয়ে নিতে পারে, উদাহরণস্বরূপ:

select Date, ... from ...
             where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)


0

আপনি এই এসকিউএল চেষ্টা করুন

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 


0
/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 10 [Id]
  ,[Id_parvandeh]
  ,[FirstName]
  ,[LastName]
  ,[RegDate]
  ,[Gilder]
  ,[Nationality]
  ,[Educ]
  ,[PhoneNumber]
  ,[DueInMashhad]

  ,[EzdevajDate]


  ,[MarriageStatus]
  ,[Gender]
  ,[Photo]

  ,[ModifiedOn]
  ,[CreatorIp]
   From
  [dbo].[Socials] where educ >= 3 or EzdevajDate  >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1

-2

এটি ভাল এইভাবে লিখুন:

CREATE PROCEDURE dbo.Get_Data_By_Dates
(
    @EmployeeId INT = 1,
    @Start_Date DATE,
    @End_Date Date
)
AS
Select * FROM Calculation  
    where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN

1
এই পরিস্থিতিতে একটি সঞ্চিত-প্রক্রিয়াটি ব্যবহার করা কোনও অর্থবোধ করবে না কারণ এটি মারাত্মকভাবে এসকিউএল কোয়েরির নমনীয়তা হ্রাস করবে, এটি এতটা সুনির্দিষ্ট হবে, আপনি যদি সত্যিই কোনও নির্দিষ্ট পরিস্থিতিতে এটি ব্যবহার করতে না চান তবে দয়া করে একটি ব্যবহার করবেন না সঞ্চিত-প্রক্রিয়া - এছাড়াও আপনার সঞ্চিত-কার্যবিধির জন্য আরও অনেক উন্নতি উপলব্ধ রয়েছে যা আপনি তাদের এই সম্প্রদায়টিতে খুঁজে পেতে পারেন;)।
shA.t

-6
SELECT Date, TotalAllowance  
FROM Calculation  
WHERE EmployeeId = 1 
  AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') 
               AND to_date ('2011/02/27','yyyy-mm-dd');

1
আপনি যখন এই উত্তরটি লিখেছিলেন তখন আপনি সম্ভবত ওরাকল এসকিউএল নিয়ে ভাবছিলেন। এটি ওরাকলে বৈধ। এসকিউএল সার্ভারে এতটা নয় (আমি যা দেখতে পারি তা থেকে)।
চার্লস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.