it-swarm.asia

استعلام SQL لتحديد التواريخ بين تاريخين

لديّ start_date و end_date. أريد الحصول على قائمة التواريخ بين هذين التاريخين. يمكن لأي شخص أن يساعدني في الإشارة إلى الخطأ في استعلامي.

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

هنا Date هو متغير datetime.

245
Neeraj

يجب عليك وضع هذين التاريخين بين علامات اقتباس مفردة مثل ..

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'
409
Deepak

نظرًا لأن مدة البيانات التي لا تحتوي على مقطع وقت محدد ستكون لها قيمة 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'

OR

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

OR

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'
108
WelshDragon

جرب هذا:

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

تحتاج قيم التاريخ إلى كتابتها كسلسلة.

لضمان المراجعة المستقبلية لاستعلام SQL Server 2008 والإصدارات الأحدث ، يجب الهروب من Date لأنه كلمة محجوزة في الإصدارات الأحدث.

ضع في اعتبارك أن التواريخ بدون أوقات تأخذ منتصف الليل كإعدادات افتراضية ، لذلك قد لا يكون لديك القيمة الصحيحة هناك.

13
user114600
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
9
Chandra Prakash

يعد هذا الاستعلام جيدًا لجلب القيم بين التاريخ الحالي والتواريخ الثلاثة القادمة

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

سيؤدي هذا في النهاية إلى إضافة 3 أيام إضافية من المخزن المؤقت إلى التاريخ الحالي.

6
Vinit Kadkol
select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

- إذا كان نوع البيانات مختلفًا

5
hamze shoae

هذا قديم جدًا ، ولكن بالنظر إلى العديد من التجارب التي مررت بها مع التواريخ ، فقد ترغب في التفكير في ذلك: قد يستخدم الأشخاص إعدادات إقليمية مختلفة ، على هذا النحو ، قد يقرأ بعض الأشخاص (وبعض قواعد البيانات/أجهزة الكمبيوتر ، حسب الإعدادات الإقليمية) تاريخ 11/12/2016 حتى 11 ديسمبر 2016 أو 12 نوفمبر 2016. بل وأكثر من ذلك ، سيتم تحويل 16/11/12 الموفر لقاعدة بيانات MySQL داخليًا إلى 12 نوفمبر 2016 ، في حين أن قاعدة بيانات Access التي تعمل على كمبيوتر إعداد إقليمي في المملكة المتحدة ستقوم بالترجمة و احفظه في 16 نوفمبر 2012.

لذلك ، جعلت من سياستي أن أكون صريحًا عندما أتفاعل مع التواريخ وقواعد البيانات. لذلك أنا دائمًا أقدم استعلاماتي ورموز البرمجة كما يلي:

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

لاحظ أيضًا أن Access سيقبل # ، وبالتالي:

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' 
4
Hannington Mambo

حاول وضع التواريخ بين # # على سبيل المثال:

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

عملت معي.

--- تحرير --- تلقيت إشعارًا بأنني فقدت نقطتي سمعة لأن شخصًا ما رفض التصويت بهذه الإجابة. من فضلك ، لا تسقط صوتك إذا كانت الإجابة غير ملائمة لك. اطلب المزيد من المعلومات/المساعدة في التعليقات ، أو تحقق من الحلول الأخرى.

لا يهمني نقاط السمعة - أقول فقط إن الأصوات المقلوبة ليست مخصصة لذلك.

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

أفضل استعلام لتحديد تاريخ بين التاريخ الحالي و العودة ثلاثة أيام :

  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)   
2
user3223432

إذا كان تاريخه خلال 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
Sheryar Nizar
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
1
Saad Sheikh

يمكننا أن نستخدم بين لعرض بيانات التاريخين ولكن هذا سوف يبحث في البيانات بأكملها ومقارنتها لذلك سوف يجعل عمليتنا بطيئة للبيانات الضخمة ، لذلك أقترح على الجميع استخدام datediff:

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

هنا calender هو الجدول ، dt كمتغير تاريخ البدء و dt2 هو متغير تاريخ الانتهاء.

1
Bipul Roy

تحقق أدناه أمثلة: كل من العمل وغير العاملين.

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

OR

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

OR

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
Tobbin Well

يمكنك تجربة هذا SQL

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

سأذهب ل

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
entonio

أود استخدام بناء الجملة "1 MonthName 2015" للتواريخ ، على سبيل المثال:

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

للتواريخ

0
Juan