SQL सर्वर: केवल पिछले वर्ष के लिए डेटा प्राप्त करें


98

मैं एक क्वेरी लिख रहा हूं जिसमें मुझे केवल पिछले वर्ष के लिए डेटा प्राप्त करना है। इसे करने का बेहतरीन तरीका क्या है?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

जवाबों:


196

निम्नलिखित वर्तमान तिथि में -1 वर्ष जोड़ता है:

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

1
तुम्हारा क्लीनर है, लेकिन यहाँ मेरे पास क्या है: YEAR (GETDATE ()) - 1
PCPGMR

2
यह आपको एक तारीख देता है, एक तारीख नहीं, आप उस तिथि की तुलना किए बिना, उस तिथि से तुलना नहीं कर सकते। यह फिर 31 दिसंबर 2014 बनाम 1 जनवरी 2015 के लिए गलत परिणाम लौटाएगा - जो अलग-अलग वर्षों में हैं, लेकिन एक साल अलग नहीं ...
samjudson

सही बात। मुझे वर्ष संख्या के आधार पर वर्ष की तुलना करने की आवश्यकता थी, इसलिए उदाहरण के लिए 2014 के माध्यम से 2013 के रूप में केवल वर्ष में आने वाले डेटा थे। मैं अपनी टिप्पणी में स्पष्ट नहीं था। धन्यवाद
PCPGMR

मुझे इस क्वेरी को चलाने में एक त्रुटि संदेश मिला ... "FUNCTION DatabaseName.DATEADD मौजूद नहीं है" कोई सुझाव?
मार्सेलो पेरी

10

मुझे यह पृष्ठ एक समाधान की तलाश में मिला जो मुझे एक पूर्व कैलेंडर वर्ष से परिणाम चुनने में मदद करेगा। ऊपर दिखाए गए अधिकांश परिणाम पिछले 365 दिनों के रिटर्न आइटम लगते हैं, जो मेरे लिए काम नहीं करते थे।

उसी समय, इसने मुझे निम्नलिखित कोड में अपनी आवश्यकताओं को हल करने के लिए पर्याप्त दिशा दी - जो मैं यहां उन अन्य लोगों के लिए पोस्ट कर रहा हूं जिन्हें मेरी जैसी ही आवश्यकता है और जो समाधान खोजने के लिए इस पृष्ठ पर आ सकते हैं।

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

ऊपर उन लोगों के लिए धन्यवाद जिनके समाधान ने मुझे मेरी ज़रूरत पर पहुंचने में मदद की।


7

खैर, मुझे लगता है कि यहां कुछ याद आ रहा है। उपयोगकर्ता पिछले वर्ष से डेटा प्राप्त करना चाहता है न कि पिछले 365 दिनों से। बहुत बड़ा अंतर है। मेरी राय में, पिछले वर्ष का डेटा 2007 से प्रत्येक डेटा है (यदि मैं अभी 2008 में हूं)। तो सही उत्तर होगा:

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

फिर यदि आप इस क्वेरी को प्रतिबंधित करना चाहते हैं, तो आप कुछ अन्य फ़िल्टर जोड़ सकते हैं, लेकिन हमेशा अंतिम वर्ष में खोज करना।

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

बड़ी तालिकाओं पर इसका बहुत बुरा प्रदर्शन होगा, आप तिथि के वर्ष मूल्य का मूल्यांकन करने के लिए प्रत्येक रिकॉर्ड पर लूप करेंगे, डेट रेंज का उपयोग करना बेहतर होगा
एड्रियन डावल


4

सबसे पठनीय, IMO:

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

कौन कौन से:

  1. अब नया जीवनकाल हो जाता है () = # 8/27/2008 10:23 am#
  2. प्रारूप 101 CONVERT (varchar, # 8/27/2008 10:23 am, 101) = '8/27/2007' के साथ एक स्ट्रिंग में कनवर्ट करता है
  3. एक डेटाइम कॉनवर्ट में कनवर्ट करता है (डेटाइम, '8/27/2007') = # 8/27/2008: 00:00#
  4. घटाव 1 वर्ष DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

आज की मध्यरात्रि को प्राप्त करने के लिए आपको DatedIFF और DATEADD के साथ वेरिएंट मिलेंगे, लेकिन वे इसके बजाय अधिक अप्रिय होते हैं (हालांकि प्रदर्शन पर थोड़ा बेहतर है - ऐसा नहीं है कि आप डेटा लाने के लिए आवश्यक रीड की तुलना में नोटिस करेंगे)।


2

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

0

अन्य सुझाव अच्छे हैं यदि आपके पास "केवल SQL" है।

हालाँकि, मेरा सुझाव है कि, यदि संभव हो - आप अपने कार्यक्रम में तारीख की गणना करें और इसे एसक्यूएल क्वेरी में स्ट्रिंग के रूप में डालें।

कम से कम बड़ी तालिकाओं के लिए (यानी कई मिलियन पंक्तियाँ, शायद जोड़ के साथ) जो आपको काफी गति में सुधार देगी क्योंकि आशावादी उतना बेहतर काम कर सकता है।


2
बेहतर होगा कि आप एक पैरामीटर स्ट्रिंग बनाएँ और मूल्य को स्ट्रिंग में रखने से बचें ...
एड्रियन डावल

0

DATEADD फ़ंक्शन के लिए तर्क:

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

तारीख हो सकती है: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms

संख्या एक ऐसी अभिव्यक्ति है जिसे एक तिथि के प्रति जोड़े गए एक इंट में हल किया जा सकता है

दिनांक एक ऐसी अभिव्यक्ति है जिसे एक समय, तिथि, स्मालडैटटाइम, डेटाटाइम, डेटाटाइम 2 या डेटाटाइमटाइम मूल्य पर हल किया जा सकता है।


0
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

1
यह प्रश्न को संबोधित नहीं करता है।
नाथन स्कर्ल

इसके अलावा, जबकि लूप आमतौर पर SQL के लिए खराब होते हैं
StingyJack

0

I, @DE व्हाइट की तरह, मूल प्रश्न की तुलना में इसी तरह के विभिन्न कारणों के लिए यहां आया था। मूल प्रश्न पिछले 365 दिनों का है। @ samjudson का उत्तर यह प्रदान करता है। @DE व्हाइट का उत्तर पूर्व कैलेंडर वर्ष के लिए रिटर्न परिणाम है।

मेरी क्वेरी थोड़ी अलग है कि यह चालू वर्ष के लिए और वर्तमान तिथि को शामिल करने के लिए काम करती है :

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

उदाहरण के लिए, 17 फरवरी, 2017 को यह क्वेरी 1/1/2016 से 2/17/2017 तक परिणाम देती है


0

मुझे एक समान समस्या थी लेकिन पिछले कोडर ने केवल मिमी-य्यी प्रारूप में तारीख प्रदान की। मेरा समाधान सरल है, लेकिन कुछ के लिए मददगार साबित हो सकता है (मैं यह भी सुनिश्चित करना चाहता था कि शुरुआत और रिक्त स्थान समाप्त हो गए):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

0

किसी कारण के लिए ऊपर दिए गए किसी भी परिणाम ने मेरे लिए काम नहीं किया।

यह पिछले 365 दिनों का चयन करता है।

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

अच्छा होगा यदि आप MSSQL सर्वर का संस्करण जोड़ सकते हैं जिसके लिए यह काम करता है।
itwasntme
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.