2009-06-23 12 views
5

मेरी तालिका में मेरे पास एक महीना (टिनिंट) और एक दिन (टिनिंट) फ़ील्ड है। मैं एक ऐसा कार्य करना चाहता हूं जो इस महीने और दिन लेता है और इस महीने और दिन के बाद अगली तारीख (वर्ष सहित) के लिए डेटाटाइम तैयार करता है।

तो अगर मेरे पास महीना = 9 था, दिन = 7 यह 9/7/2009 का उत्पादन करेगा।
यदि मेरे पास महीना 1 था, दिन 1 यह 1/1/2010 उत्पन्न करेगा।एसक्यूएल: महीने और दिन

+0

आप क्या साल का उपयोग कैसे पता है? क्या आप मानते हैं कि यह हमेशा चालू तारीख से आधारित होगा? इसके अलावा, आप किस डेटाबेस का उपयोग कर रहे हैं? – northpole

+0

यह आज से आधारित है। तो आइए आज 6/23/2009 कहें। तालिका में दिनांक महीना = 6, दिन = 22 है। फिर मैं इसे 6/22/2010 वापस करना चाहता हूं क्योंकि यह अगली तारीख है। –

उत्तर

2

कुछ इस तरह काम करेगा एक तिथि देता है। यह आपकी विधि पर भिन्नता है, लेकिन यह एमएम/डीडी/वाई वाई वाईवाई शाब्दिक प्रारूप का उपयोग नहीं करता है, और यह खराब इनपुट (बेहतर या बदतर के लिए) के खिलाफ नहीं होगा।

declare @month tinyint 
declare @day tinyint 
set @month = 9 
set @day = 1 

declare @date datetime 

-- this could be inlined if desired 
set @date = convert(char(4),year(getdate()))+'0101' 
set @date = dateadd(month,@month-1,@date) 
set @date = dateadd(day,@day-1,@date) 

if @date <= getdate()-1 
    set @date = dateadd(year,1,@date) 

select @date 

वैकल्पिक रूप से, YYYYMMDD प्रारूप में एक स्ट्रिंग बनाने के लिए:

set @date = 
    right('0000'+convert(char(4),year(getdate())),4) 
+ right('00'+convert(char(2),@month),2) 
+ right('00'+convert(char(2),@day),2) 

एक अन्य विधि है, जो शाब्दिक सब एक साथ से बचा जाता है:

declare @month tinyint 
declare @day tinyint 
set @month = 6 
set @day = 24 

declare @date datetime 
declare @today datetime 

-- get todays date, stripping out the hours and minutes 
-- and save the value for later 
set @date = floor(convert(float,getdate())) 
set @today = @date 

-- add the appropriate number of months and days 
set @date = dateadd(month,@month-month(@date),@date) 
set @date = dateadd(day,@day-day(@date),@date) 

-- increment year by 1 if necessary 
if @date < @today set @date = dateadd(year,1,@date) 

select @date 
1

यहां तक ​​मेरा एसक्यूएल उदाहरण है। मैं वास्तव में यह पसंद नहीं है, हालांकि ...

DECLARE @month tinyint, 
    @day tinyint, 
    @date datetime 

SET @month = 1 
SET @day = 1 

-- SET DATE TO DATE WITH CURRENT YEAR 
SET @date = CONVERT(datetime, CONVERT(varchar,@month) + '/' + CONVERT(varchar,@day) + '/' + CONVERT(varchar,YEAR(GETDATE()))) 


-- IF DATE IS BEFORE TODAY, ADD ANOTHER YEAR 
IF (DATEDIFF(DAY, GETDATE(), @date) < 0) 
BEGIN 
    SET @date = DATEADD(YEAR, 1, @date) 
END 

SELECT @date 
+2

दिनांक अक्षर के लिए एमएम/डीडी/वाई वाई वाई प्रारूप का उपयोग न करें। इसके बजाय YYYYMMDD का उपयोग करें। यह स्थानीयकरण के मुद्दों से बच जाएगा, और यह ठीक तरह से ठीक है। –

+0

अन्यथा, मुझे आपकी विधि में कोई समस्या नहीं दिखाई दे रही है। क्या आप एक शाब्दिक से रूपांतरण नापसंद करते हैं? –

+0

ऐसा लगता है कि कुछ आसान समाधान होना चाहिए। –

1

यहाँ PostgreSQL के साथ एक समाधान है

your_date_calculated = Year * 10000 + Month * 100 + Day 

आप की तरह 20090623.

select cast(cast(your_date_calculated as varchar) as date) + 1 
1

यहाँ मेरी संस्करण है। इसके बारे में कोर सिर्फ दो लाइनों, DATEADD फ़ंक्शन का उपयोग है, और यह तार से करने के लिए/किसी भी रूपांतरण की आवश्यकता नहीं है, तैरता या कुछ और:

DECLARE @Month TINYINT 
DECLARE @Day TINYINT 

SET @Month = 9 
SET @Day = 7 

DECLARE @Result DATETIME 

SET @Result = 
    DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + @Month - 1, @Day - 1) 
IF (@Result < GETDATE()) 
    SET @Result = DATEADD(year, 1, @Result) 

SELECT @Result 
+0

अच्छा। फ़ंक्शन कॉल ओवरहेड से बचने के लिए इन-लाइन संस्करण के बारे में कैसे? उदाहरण के लिए, दिनांक दिनांक दिनांक (वर्ष, <अभिव्यक्ति यहां>, DATEADD (माह, ((वर्ष (GETDATE()) - 1 9 00) * 12) + महीना फ़ील्ड - 1, डेफिल्ड - 1)) से न्यूडेट के रूप में .... –

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