خادم قاعدة البيانات:الحصول على بيانات للعام الماضي فقط

StackOverflow https://stackoverflow.com/questions/30222

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أكتب استعلامًا يجب أن أحصل فيه على بيانات العام الماضي فقط.ما هي أفضل طريقة للقيام بذلك؟

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
هل كانت مفيدة؟

المحلول

يضيف ما يلي -1 سنة إلى التاريخ الحالي:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

نصائح أخرى

لقد وجدت هذه الصفحة أثناء البحث عن حل من شأنه أن يساعدني في تحديد النتائج من سنة تقويمية سابقة.يبدو أن معظم النتائج الموضحة أعلاه تعيد عناصر من الـ 365 يومًا الماضية، وهو ما لم ينجح معي.

وفي الوقت نفسه، أعطاني ما يكفي من التوجيه لحل احتياجاتي في الكود التالي - والذي أقوم بنشره هنا لأي شخص آخر لديه نفس احتياجاتي والذين قد يصادفون هذه الصفحة بحثًا عن حل.

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

شكرًا لأولئك الذين ساعدتني حلولهم المذكورة أعلاه في الوصول إلى ما أحتاج إليه.

حسنًا، أعتقد أن هناك شيئًا مفقودًا هنا.يريد المستخدم الحصول على بيانات من العام الماضي وليس من آخر 365 يومًا.هناك فرق كبير.في رأيي، بيانات العام الماضي هي كل بيانات عام 2007 (إذا كنت في عام 2008 الآن).لذا فإن الإجابة الصحيحة ستكون:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

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

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

ابحث عن dateadd في BOL

dateadd(yy,-1,getdate())

الأكثر قراءة، IMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

أيّ:

  1. يحصل على وقت التاريخ الآن تاريخ الحصول () = #27/8/2008 10:23 صباحًا#
  2. يحول إلى سلسلة بتنسيق 101 تحويل (فارتشار، #8/27/2008 10:23 ص#، 101) = '8/27/2007'
  3. يتحول إلى تاريخ تحويل (التاريخ والوقت، '27/8/2007') = #27/8/2008 12:00 صباحًا#
  4. يطرح 1 سنة DATEADD(yy, -1, #8/27/2008 12:00AM#) = #8/27/2007 12:00AM#

هناك متغيرات مع DATEDIFF وDATEADD لتحصل على منتصف ليل اليوم، ولكنها تميل إلى أن تكون منفرجة إلى حد ما (على الرغم من أنها أفضل قليلاً من حيث الأداء - وهو ما لا تلاحظه مقارنة بالقراءات المطلوبة لجلب البيانات).

GETDATE() ترجع التاريخ الحالي و الوقت.

لو العام الماضي يبدأ في منتصف ليل اليوم الحالي من العام الماضي (كما في المثال الأصلي)، ويجب عليك استخدام شيء مثل:

DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) --  getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start

الاقتراحات الأخرى جيدة إذا كان لديك "SQL فقط".

ومع ذلك أقترح أن - إذا كان ذلك ممكنا - تقوم بحساب التاريخ في برنامجك وإدراجه كسلسلة في استعلام SQL.

على الأقل للطاولات الكبيرة (أي.عدة ملايين من الصفوف، ربما يتم دمجها مع الصلات) والتي ستمنحك تحسينًا كبيرًا في السرعة حيث يمكن للمُحسِّن العمل مع ذلك بشكل أفضل بكثير.

وسيطة الدالة DATEADD :

DATEADD (*datepart* , *number* , *date* )

datepart يمكن ان يكون:ص، ف ف، مم، دي، ي ي، أسبوع، دو، سمو، مي، ثس، مللي ثانية

رقم هو تعبير يمكن حله إلى int الذي تتم إضافته إلى جزء تاريخ من التاريخ

تاريخ هو تعبير يمكن حله لقيمة وقت أو تاريخ أو وقت صغير أو وقت التاريخ أو تاريخ الوقت 2 أو قيمة إزاحة التاريخ.

declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
    set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
    set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
    select @sYear + @sMonth
    set @iMonth = @iMonth - 1
end

أنا مثل @D.E.وايت، جاء إلى هنا لأسباب مماثلة ولكن مختلفة عن السؤال الأصلي.السؤال الأصلي يسأل عن آخر 365 يومًا.توفر إجابة @ samjudson ذلك.@د.تقوم إجابة White بإرجاع نتائج السنة التقويمية السابقة.

استعلامي مختلف بعض الشيء لأنه يعمل مع العام السابق حتى التاريخ الحالي ويتضمنه:

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

على سبيل المثال، في 17 فبراير 2017، يعرض هذا الاستعلام النتائج من 1/1/2016 إلى 17/2/2017

لقد واجهت مشكلة مماثلة ولكن المبرمج السابق قدم فقط التاريخ بتنسيق mm-yyyy.الحل الخاص بي بسيط ولكنه قد يكون مفيدًا للبعض (أردت أيضًا التأكد من حذف مسافات البداية والنهاية):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top