2008-08-27 13 views
69

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

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

उत्तर

145

निम्नलिखित कहते हैं -1 वर्तमान दिनांक के वर्ष:

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

तुम्हारा क्लीनर है, लेकिन यहाँ मैं क्या था: वर्ष (GETDATE()) - 1 – PCPGMR

+0

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

+0

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

1

GETDATE बोल में DATEADD खोजें() आज की तारीख और समय देता है।

तो पिछले साल (मूल उदाहरण की तरह) आप की तरह कुछ का उपयोग करना चाहिए वर्तमान दिन पिछले साल की आधी रात में शुरू होता है:

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 
2

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

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

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

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

यह बड़ी तालिकाओं पर बहुत खराब प्रदर्शन करेगा, आप तारीख के साल के मूल्य का मूल्यांकन करने के लिए प्रत्येक रिकॉर्ड पर लूप करेंगे, –

2

सबसे पठनीय में खोज, :

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

कौन सा:

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

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

0

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

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

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

+2

दिनांक सीमा का उपयोग करना बेहतर होगा यदि आप पैरामीटरयुक्त स्ट्रिंग बनाते हैं तो बेहतर होगा और मूल्य को स्ट्रिंग में रखने से बचें ... –

0

तर्क:

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

DatePart हो सकता है: yy, qq, मिमी, उप, dd, hh, DW, सप्ताह, मील, एस एस, एमएस

संख्या एक अभिव्यक्ति है जिसे किसी दिनांक को

दिनांक एक अभिव्यक्ति है जिसे एक समय, तिथि, smalldatetime, डेटाटाइम, डेटाटाइम 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

यह प्रश्न का समाधान नहीं करता है। –

+0

इसके अलावा, जबकि लूप आमतौर पर SQL – StingyJack

8

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

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

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

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

-2

कहां तारीख> DATE_SUB (NOW(), अंतराल 1 वर्ष)

यह आपको एक प्रश्न है कि डेटा के 1 वर्ष खींच लेंगे जब भी आप इसे चलाने दे देंगे।

+1

के लिए खराब हैं, प्रश्न Microsoft SQL सर्वर के लिए है जो न तो 'date_sub' फ़ंक्शन और न ही' अंतराल 'निर्माण का उपयोग करता है। – jpw

0

मैं, @ डी.ई. की तरह। सफेद, मूल प्रश्न की तुलना में समान लेकिन अलग-अलग कारणों के लिए यहां आया था। मूल प्रश्न पिछले 365 दिनों के लिए पूछता है। @ samjudson का जवाब यह प्रदान करता है। @डे। व्हाइट का जवाब पिछले कैलेंडर वर्ष के परिणाम देता है। फ़र, 17, 2017 इस क्वेरी से परिणाम पर

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

उदाहरण के लिए,:

मेरे क्वेरी थोड़ी अलग है कि यह करने के लिए और सहित आज की तारीख तक पूर्व वर्ष के लिए काम करता है 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()) 
संबंधित मुद्दे

 संबंधित मुद्दे