SQL क्वेरी दो तिथियों के बीच तारीखों का चयन करने के लिए


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
SQL सर्वर 00:00:00 तक एक समय के बिना डेट डिफॉल्ट करता है। तो क्या यह क्वेरी 2011/02/25 और 2011/02/26 की मध्यरात्रि से वापस नहीं आएगी?
मैट

5
@ दीपक, आपके दूसरे बिट को कहना चाहिए = = और <=
IndoKnight

3
आप यह उल्लेख कर सकते हैं कि ऑर्डर बॅटविन समारोह में मायने रखता है। यह बाईं ओर सबसे पुराने से और हाल ही में दाईं ओर से जाना है। यह अनइंस्टिट्यूट के रूप में = sql में एक तुलनात्मक ऑपरेटर है और जहां "क्लॉज" में "EmployeeId = 1" या "1 = EmployeeId" दोनों के लिए काम करता है।
Fi Horan

@Matt, के लिए दस्तावेज़ के अनुसार के बीच , अगर एक पंक्ति एक समय बिना 2011/02/27 की तारीख थी, तो उस पंक्ति 2011/02/27 00:00 एक तारीख होने के बराबर है और में लौटा दिया जाएगा क्वेरी, क्योंकि यह 2011/02/27 00:00 से कम या बराबर है। इसलिए यदि आप समय के साथ काम नहीं कर रहे हैं, तो betweenउम्मीद के मुताबिक काम करना चाहिए।
तिकरित

@timctran राइट, लेकिन 2011/02/27 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'

निम्नलिखित का उपयोग न करें, क्योंकि यह 2011/02/28 से कुछ रिकॉर्ड वापस कर सकता है यदि उनका समय 00: 00: 00.000 हो।

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

42
लोग अभी भी इन सवालों और जवाबों को देखते हैं, भले ही वे मूल रूप से कुछ समय पहले पेश किए गए थे। मैं एक उत्तर की तलाश में आया था, और जो कुछ मैंने यहाँ देखा था, वह अधूरा या बिल्कुल गलत था। मेरा उत्तर मूल पोस्टर की मदद नहीं करेगा, लेकिन यह किसी की मदद कर सकता है, शायद अब से तीन साल बाद भी।
वेल्शड्रैगन

3
आपके उत्तर ने मुझे बहुत मदद की, @WelshDragon - अन्य उत्तरों ने इस तथ्य को छोड़ दिया कि तिथि प्रारूप को घंटों की अनदेखी करने के लिए सर्वर पर "सरल तिथि" होने की आवश्यकता है। "<= END_DATE" 12AM मानता है, जो मुझे नहीं पता था। मैं "... <= 01/01/2014" के साथ एक क्वेरी कर रहा था और मैं यह पता नहीं लगा सका कि उस तारीख के आदेश 1 के लिए क्यों नहीं दिखाए जा रहे थे। आपका बहुत बहुत धन्यवाद।
कीथ

@ वेल्शड्रैगन - आपका उत्तर क्लॉज के रूप में तारीखों का उपयोग करने के लिए एक बहुत अच्छी सामग्री है। धन्यवाद
जैक फ्रॉस्ट

अगर यह वापस आ गया तो क्या गलत है '2011/02/28 00:00:00.000'?
मुफ्लिक्स

1
आज यह कोशिश की, आप भी उपयोग कर सकते हैं convert(date, Date) between '2011/02/25' and '2011/02/27'(कम से कम हाल ही में एमएस SQL ​​सर्वर के साथ)। convert()अंशकालिक हिस्सा अलग करना का ख्याल रखना होगा और तुलना के बीच तो अपेक्षा के अनुरूप काम करेंगे।
सेंसेई

14

इसे इस्तेमाल करे:

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

तार के रूप में दिनांक मान टाइप करने की आवश्यकता है।

SQL Server 2008 और उच्चतर के लिए अपनी क्वेरी को भविष्य में प्रमाणित करने के लिए, Dateबच जाना चाहिए क्योंकि यह बाद के संस्करणों में आरक्षित शब्द है।

ध्यान रखें कि समय के बिना तारीखें आधी रात को उनकी चूक के रूप में लेती हैं, इसलिए आपके पास वहां सही मूल्य नहीं हो सकता है।


1
दिनांक कोई कीवर्ड नहीं है और उसे भागने की आवश्यकता नहीं है। सिंटैक्स हाइलाइटिंग सिर्फ सिंटैक्स हाइलाइटिंग है, यदि सिंटैक्स त्रुटि का कारण होता है, तो कीवर्ड को केवल बचने की आवश्यकता होती है। डेटास्रिंग स्थिरांक के निहित रूपांतरण के बजाय स्पष्ट रूपांतरण का उपयोग करना भी एक अच्छा अभ्यास है। - और CAST ('2011/02 / 25'AS DATETIME) और CAST (' 2011/02 / 27'AS DATETIME) के बीच की तारीख
tponthieux

5
स्वाभाविक रूप से आप सही हैं यदि यह SQL सर्वर 2005 है, जिसे ओपी ने टैग किया है। हालाँकि, दिनांक 2008 में और ऊपर आरक्षित है, इसलिए भविष्य के प्रमाण के लिए, इससे बचने में कोई बुराई नहीं है। मैंने अपना उत्तर संपादित कर दिया है।

1
यदि वह दोनों के लिए एक ही तिथि निर्दिष्ट करता है तो यह शून्य पंक्तियों को लौटाएगा लेकिन मुझे लगता है कि यह op की आवश्यकता नहीं है
Zo has

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

यह बहुत पुराना है, लेकिन मेरे पास तारीखों के साथ बहुत सारे अनुभव हैं, आप इस पर विचार करना चाह सकते हैं: लोग विभिन्न क्षेत्रीय सेटिंग्स का उपयोग करते हैं, जैसे, कुछ लोग (और कुछ डेटाबेस / कंप्यूटर, क्षेत्रीय सेटिंग्स के आधार पर) इसे पढ़ सकते हैं दिनांक ११/१२/२०१६ को ११ दिसंबर २०१६ या १२ नवंबर २०१६ को। इससे भी अधिक, १६/११/१२ को MySQL डेटाबेस को आपूर्ति की गई आंतरिक रूप से १२ नवंबर २०१६ में परिवर्तित हो जाएगी, जबकि यूके के क्षेत्रीय सेटिंग कंप्यूटर पर चलने वाला एक्सेस डेटाबेस व्याख्या करेगा। इसे 16 नवंबर 2012 तक संग्रहीत करें।

इसलिए, जब भी मैं तारीखों और डेटाबेस के साथ बातचीत करने जा रहा हूं, मैंने इसे स्पष्ट करने के लिए अपनी नीति बनाई। इसलिए मैं हमेशा अपने प्रश्नों और प्रोग्रामिंग कोड की आपूर्ति इस प्रकार करता हूं:

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

ध्यान दें कि एक्सेस इस प्रकार # स्वीकार करेगा:

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

लेकिन MS SQL सर्वर नहीं होगा, इसलिए मैं हमेशा उपरोक्त के रूप में "" का उपयोग करता हूं, जिसे दोनों डेटाबेस स्वीकार करते हैं।

और कोड में एक चर से उस तारीख को प्राप्त करते समय, मैं हमेशा परिणाम को स्ट्रिंग में परिवर्तित करता हूं:

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

मैं यह इसलिए लिख रहा हूं क्योंकि मुझे पता है कि कभी-कभी कुछ प्रोग्रामर पर्याप्त रूप से निहित रूपांतरण का पता लगाने के लिए उत्सुक नहीं होते हैं। दिनांक <13 के लिए कोई त्रुटि नहीं होगी, बस अलग परिणाम!

पूछे गए प्रश्न के अनुसार, अंतिम तिथि में एक दिन जोड़ें और तुलना इस प्रकार करें:

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

आपकी जानकारी ने मेरा काम पूरा करने में मदद की। मैंने इस पर 10 घंटे से अधिक काम किया है और गैर जवाब मेरे लिए काम करेंगे। जब मैं आप की तरह सहमति देता हूं तो आपने मेरे प्रोजेक्ट को शानदार तरीके से दिखाया है। लेकिन नियम यह है कि इस तरह से एसक्यूएल स्टेटमेंट नहीं लिखा जाना चाहिए। जब भी मैं SQL कथन में दिनांक पैरामीटर जोड़ने के लिए SqlCommand सेट करने का प्रयास करता हूं, तो पैरामीटर संलग्न नहीं होंगे और मुझे वह त्रुटि मिलती है जिसे मुझे "@startDate" और "@endDate" घोषित करना होगा। मैं इस मुद्दे को पारित नहीं कर सकता। मैंने आपके दिनांक प्रारूप "dd MMM yyyy" की कोशिश की, जिसने काम किया और मैंने "yyyy MMM dd" की भी कोशिश की, जिसने भी ऐसा ही किया।
डेव हम्पेल

बहुत मदद मिली! ऊपर कोड नमूने हैं। SQL इंजेक्शन से बचने के लिए पैरामीटर घोषित करना और उपयोग करना हमेशा बेहतर होता है। और ऐसा लगता है कि आप अपनी परियोजना में नियमों द्वारा पहले से ही आवश्यक / संरक्षित हैं, जो अच्छा है।
हिंगिंगटन मम्बो

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
इस संदर्भ में # क्या करता है?
बीके

@ बीके यह एक सीमांकक है, जैसे तार के लिए उद्धरण चिह्न। "जब एक SQL कथन के मानों की आपूर्ति करते हैं, उदाहरण के लिए क्वेरी मानदंड के रूप में, तो उनके डेटा प्रकार को" क्वालिफायर "द्वारा सही ढंग से परिभाषित किया जाना चाहिए। यह उचित वर्णों की एक जोड़ी के बीच मूल्य को संलग्न करके किया जाता है।" संदर्भ -> लिंक
अलेक्जेंडर

1
@BK यदि यह TSql सिंटैक्स है, तो आपको जो आवश्यक है उसे प्राप्त करने के लिए आपको एकल उद्धरण चिह्नों ( ' ) का उपयोग करना होगा । संदर्भ * sql-fontstuff.com की मूल बातें * शुरुआत SQL - पॉल विल्सन, जॉन कोल्बी
अलेक्जेंडर

1
यह कोई और अधिक स्पष्ट नहीं हो सकता है कि प्रश्न SQL सर्वर और T-SQL के लिए है। टी-एसक्यूएल और एसक्यूएल सर्वर हैश टैग के बीच तारीखों को स्वीकार नहीं करते हैं, यह एकल उद्धरणों के बीच की तारीखों को स्वीकार करता है। यह उत्तर गलत है।
टीटी।

@TT। उत्थान की संख्या कहती है कि इसने अभी भी किसी की मदद की है। जिस समय मैंने अपना उत्तर लिखा था, स्वीकृत उत्तर पहले ही चुना जा चुका था। फिर भी, मैंने इसे किसी ऐसे व्यक्ति की मदद करने के लिए लिखा है जो Google या कहीं और से आ सकता है :)
अलेक्जेंडर

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 "

यहाँ कैलेंडर, तालिका है, जो कि शुरुआती तिथि चर के रूप में है और 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

आप इस SQL ​​की कोशिश करो

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
इस स्थिति में संग्रहीत-प्रक्रिया का उपयोग करने का कोई मतलब नहीं होगा क्योंकि यह SQL क्वेरी के लचीलेपन को कम कर देगा, यह इतना विशिष्ट होगा, यदि आप इसे वास्तव में विशिष्ट स्थिति में उपयोग नहीं करना चाहते हैं, तो कृपया उपयोग न करें Stored-Procedure - इसके अलावा आपके Stored-Procedure के लिए कई बेहतर सुविधाएं उपलब्ध हैं जो आप उन्हें इस समुदाय में पा सकते हैं;)
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
जब आप यह उत्तर लिखते हैं तो आप शायद Oracle SQL के बारे में सोच रहे थे। यह Oracle में मान्य है। SQL सर्वर में इतना नहीं है (जो मैं देख सकता हूं)।
चार्ल्स कैलडवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.