जहां एक विशिष्ट महीने में सभी रिकॉर्ड खोजने के लिए खंड


87

मैं एक संग्रहीत प्रक्रिया को एक महीना और वर्ष देने में सक्षम होना चाहता हूं और क्या यह उस महीने में होने वाली हर चीज को वापस कर सकता है, मैं यह कैसे कर सकता हूं क्योंकि मैं तुलना नहीं कर सकता क्योंकि कुछ महीनों में दिनों की संख्या अलग है आदि?

ऐसा करने का सबसे अच्छा तरीका क्या है? क्या मैं सिर्फ वर्ष और महीने के आधार पर तुलना करने के लिए कह सकता हूं?

धन्यवाद।

जवाबों:


186

मुझे लगता है कि आप जिस कार्य की तलाश कर रहे हैं वह है MONTH(date)। आप शायद 'YEAR' का भी उपयोग करना चाहेंगे ।

मान लेते हैं कि आपके पास एक तालिका है जिसका नाम thingsकुछ इस तरह है:

id happend_at
-- ----------------
1  2009-01-01 12:08
2  2009-02-01 12:00
3  2009-01-12 09:40
4  2009-01-29 17:55

और happened_atमान लें कि आप उन सभी रिकॉर्डों को खोजने के लिए निष्पादित करना चाहते हैं जो महीने 2009/01 (जनवरी 2009) के दौरान हैं। SQL क्वेरी होगी:

SELECT id FROM things 
   WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009

जो लौटेगा:

id
---
1
3
4

14
वास्तव में ! किसी के लिए भी दिलचस्पी है कि "DAY, MONTH और YEAR फ़ंक्शंस क्रमशः DATEPART (dd, date), DATEPART (mm, date) और DATEPART (yy, date) के समानार्थी हैं।"
मई'०9 को शाम

17

अधिकांश प्रतिक्रियाओं में सुझाए गए MONTH और YEAR फ़ंक्शंस का उपयोग करने से नुकसान यह है कि SQL सर्वर आपके डेट कॉलम पर मौजूद किसी भी इंडेक्स का उपयोग करने में सक्षम नहीं होगा। यह एक बड़ी मेज पर प्रदर्शन को मार सकता है।

मैं एक DATETIME मान (जैसे @StartDate) को संग्रहीत कार्यविधि में पास करना चाहूंगा जो उस महीने के पहले दिन का प्रतिनिधित्व करता है जिसमें आप रुचि रखते हैं।

तब आप उपयोग कर सकते हैं

SELECT ... FROM ...
WHERE DateColumn >= @StartDate 
AND DateColumn < DATEADD(month, 1, @StartDate)

यदि आपको संग्रहीत कार्यविधि के लिए अलग-अलग मापदंडों के रूप में महीने और वर्ष को पास करना होगा, तो आप CAT और CONVERT का उपयोग करके महीने के पहले दिन का प्रतिनिधित्व करने वाला DATETIME उत्पन्न कर सकते हैं, फिर ऊपर के रूप में आगे बढ़ें। यदि आप ऐसा करते हैं, तो मैं एक फ़ंक्शन लिखने की सलाह दूंगा जो पूर्णांक वर्ष, महीने, दिन के मूल्यों से एक DATETIME उत्पन्न करता है, उदाहरण के लिए SQL सर्वर ब्लॉग से निम्न ।

create function Date(@Year int, @Month int, @Day int)
returns datetime
as
    begin
    return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
    end
go

क्वेरी तब बन जाती है:

SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))

1
हां मैं @joe से सहमत हूं "अधिकांश प्रतिक्रियाओं के रूप में सुझाए गए MONTH और YEAR फ़ंक्शंस का उपयोग करने से नुकसान यह है कि SQL सर्वर आपके डेट कॉलम पर किसी भी इंडेक्स का उपयोग करने में सक्षम नहीं होगा। यह एक बड़े टेबल पर प्रदर्शन को मार सकता है। । "
राघव

क्या मैं कुछ जोड़ सकता हूँ? यदि आप एक पैरामीटर में '@StartDate की घोषणा कर रहे हैं, तो मैं भी, #EndDate की घोषणा करूंगा और DATEADD को वहां रखूंगा, बजाय SQL को प्रत्येक पंक्ति पर गणित करने के।
डेटागर्ल

@DataGirl - दिलचस्प बिंदु। मैंने मान लिया था कि DATEADD फ़ंक्शन को एक रनटाइम स्थिरांक के रूप में माना जाएगा और केवल एक बार मूल्यांकन किया जाएगा। यदि इस बारे में संदेह है, तो घोषित @EndDateकरना स्पष्ट कर देगा।
जो

4

बहुत आसान एक टिप। तुम भी इस्तेमाल कर सकते हैं TO_CHAR समारोह, देखो:

महीने के लिए:

to_char ( हुआ_त , 'MM') = 01

वर्ष के लिए:
to_char ( हुआ_आट , 'YYYY') = 2009

दिन के लिए:

to_char ( हुआ_आट , 'डीडी') = 01

to_char फफूंद को एसक्यूएल भाषा द्वारा सुधारा जाता है और एक विशिष्ट डेटाबेस द्वारा नहीं।

मुझे आशा है कि किसी और की मदद ...

पेट!


1
मुझे आभास है कि यह केवल ओरेकल के लिए काम करता है, यह वास्तव में विशिष्ट है। SQL सर्वर निश्चित रूप से इसका समर्थन नहीं करता है।
कैरोल

3

MONTH और YEAR फ़ंक्शन के विकल्प के रूप में, एक नियमित WHERE क्लॉज भी काम करेगा:

select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'

2

यदि आप SQL सर्वर का उपयोग कर रहे हैं, DATEPART में देखें।

http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx

DATEPART (मिमी, [आप की तलाश में है]

आप इसके साथ सामान्य पूर्णांक तर्क का उपयोग कर सकते हैं। उसी वर्ष, मिमी के बजाय बस yy का उपयोग करें।


1

क्या मैं सिर्फ वर्ष और महीने के आधार पर तुलना करने के लिए कह सकता हूं?

आप ऐसा कर सकते हैं। यहाँ एक सरल उदाहरण है AdventureWorks नमूना डेटाबेस का उपयोग कर ...

DECLARE @Year       INT
DECLARE @Month      INT

SET @Year = 2002
SET @Month = 6

SELECT 
    [pch].* 
FROM 
    [Production].[ProductCostHistory]   pch
WHERE
    YEAR([pch].[ModifiedDate]) = @Year
AND MONTH([pch].[ModifiedDate]) = @Month

1

मुझे एक अस्थायी डेटा प्रकार (जैसे DATETIME) के रूप में एक मूल्य पास करना आसान लगता है , फिर अस्थायी कार्यक्षमता का उपयोग करें, विशेष रूप से DATEADDऔर DATEPART, अवधि के लिए आरंभ और समाप्ति तिथियों का पता लगाने के लिए, इस मामले में महीने जैसे कि प्रारंभ दिनांक और समाप्ति दिनांक जोड़ी को ढूंढता है। वर्तमान माह के लिए, CURRENT_TIMESTAMPआपके लिए केवल प्रकार का पैरामीटर DATETIME(1990-01-01 का मान पूरी तरह से मनमाना है) विकल्प:

SELECT DATEADD(M, 
          DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), 
          '1990-01-01T00:00:00.000'), 
       DATEADD(M, 
          DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), 
          '1990-01-31T23:59:59.997')

0

कुछ इस तरह से करना चाहिए:

select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year

वैकल्पिक रूप से आप रिकॉर्ड बनाते समय महीने और साल को अपने स्वयं के कॉलम में विभाजित कर सकते हैं और फिर उनके खिलाफ चयन कर सकते हैं।

इयान


0

एक तरीका एक चर बनाना होगा जो महीने के पहले (यानी 5/1/2009) का प्रतिनिधित्व करता है, या तो इसे खरीद में पारित करें या इसे बनाएं (संक्षिप्त माह / 1 / वर्ष)। फिर DateDiff फ़ंक्शन का उपयोग करें।

WHERE DateDiff(m,@Date,DateField) = 0

यह एक मिलान महीने और वर्ष के साथ कुछ भी लौटाएगा।


-4
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';

AAAAवह वर्ष कहां है जो आप चाहते हैं और MMवह महीना है जो आप चाहते हैं

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