sql - टी-एसक्यूएल के साथ एक तारीख बनाएँ




sql-server sql-server-2005 (10)

12 से नीचे SQL सर्वर संस्करणों के लिए मैं SET DATEFORMAT संयोजन में CAST उपयोग की अनुशंसा कर सकता SET DATEFORMAT

-- 26 February 2015
SET DATEFORMAT dmy
SELECT CAST('26-2-2015' AS DATE)

SET DATEFORMAT ymd
SELECT CAST('2015-2-26' AS DATE)

आप उन तारों को कैसे बनाते हैं आप पर निर्भर हैं

मैं अलग-अलग हिस्सों जैसे कि 12, 1, 2007 को SQL सर्वर 2005 में डेटाटाइम में एक तिथि बदलने की कोशिश कर रहा हूं। मैंने निम्न कोशिश की है:

CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)

लेकिन यह गलत तारीख में परिणाम। तीन दिनांक मानों को उचित डेटाटाइम प्रारूप में बदलने का सही तरीका क्या है।


CAST के बजाय CONVERT आज़माएं।

कनवर्टर दिनांक प्रारूप को इंगित करने वाले तीसरे पैरामीटर की अनुमति देता है।

प्रारूपों की सूची यहां है: http://msdn.microsoft.com/en-us/library/ms187928.aspx

एक और उत्तर के बाद अद्यतन "सही" उत्तर के रूप में चुना गया है:

मैं वास्तव में समझ नहीं पा रहा हूं कि एक उत्तर क्यों चुना गया है जो स्पष्ट रूप से इस सर्वर को इंगित किए बिना आपके सर्वर पर एनएलएस सेटिंग्स पर निर्भर करता है।


इस क्वेरी को आज़माएं:

    SELECT SUBSTRING(CONVERT(VARCHAR,JOINGDATE,103),7,4)AS
    YEAR,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),1,2)AS
MONTH,SUBSTRING(CONVERT(VARCHAR,JOINGDATE,100),4,3)AS DATE FROM EMPLOYEE1

परिणाम:

2014    Ja    1
2015    Ja    1
2014    Ja    1
2015    Ja    1
2012    Ja    1
2010    Ja    1
2015    Ja    1

इसे इस्तेमाल करे:

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1, 
          DateAdd(month, @Month - 1, 
              DateAdd(Year, @Year-1900, 0)))

यह भी काम करता है, किसी भी स्ट्रिंग रूपांतरण नहीं करने का लाभ जोड़ा गया है, इसलिए यह शुद्ध अंकगणितीय प्रसंस्करण (बहुत तेज़) है और यह किसी भी दिनांक प्रारूप पर निर्भर नहीं है यह इस तथ्य पर केंद्रित है कि SQL सर्वर का डेटाटाइम और smalldatetime मानों के लिए आंतरिक प्रतिनिधित्व दो है भाग का पहला भाग 1 जनवरी 1 9 00 से दिनों की संख्या का प्रतिनिधित्व करने वाला एक पूर्णांक है, और दूसरा भाग एक दशमलव अंश है जो एक दिन के अंश (भाग के लिए) का प्रतिनिधित्व करता है --- तो पूर्णांक मान 0 (शून्य ) हमेशा 1 जनवरी 1 9 00 की मध्यरात्रि सुबह में सीधे अनुवाद करता है ...

या, @brinary से सुझाव के लिए धन्यवाद,

Select DateAdd(yy, @Year-1900,  
       DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 

अक्टूबर 2014 को संपादित किया गया। जैसा कि @ कैड रूक्स द्वारा नोट किया गया है, एसक्यूएल 2012 में अब एक अंतर्निहित कार्य है:
DATEFROMPARTS(year, month, day)
यह वही काम करता है।

संपादित 3 अक्टूबर 2016, (इसे देखने के लिए @bambams के लिए धन्यवाद, और इसे हटाने के लिए @brinary), अंतिम समाधान, @brinary द्वारा प्रस्तावित। लीप साल के लिए काम नहीं करता है जब तक कि साल के अतिरिक्त प्रदर्शन नहीं किया जाता है

select dateadd(month, @Month - 1, 
     dateadd(year, @Year-1900, @DayOfMonth - 1)); 

एसक्यूएल सर्वर 2012 में एक अद्भुत और लंबे समय से प्रतीक्षित नया DATEFROMPARTS फ़ंक्शन है (यदि तिथि अमान्य है तो एक त्रुटि उठाएगी - इस समस्या के लिए DATEADD- आधारित समाधान पर मेरा मुख्य आपत्ति):

http://msdn.microsoft.com/en-us/library/hh213228.aspx

DATEFROMPARTS(ycolumn, mcolumn, dcolumn)

या

DATEFROMPARTS(@y, @m, @d)

एसक्यूएल सर्वर 2012 में एक ऐसा फ़ंक्शन है जो भागों ( DATEFROMPARTS ) के आधार पर दिनांक बनाएगा। हम में से बाकी के लिए, यहां एक डीबी फ़ंक्शन बनाया गया है जो मैंने भागों से तारीख निर्धारित करेगा (धन्यवाद @ चार्ल्स) ...

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[func_DateFromParts]'))
    DROP FUNCTION [dbo].[func_DateFromParts]
GO

CREATE FUNCTION [dbo].[func_DateFromParts]
(
    @Year INT,
    @Month INT,
    @DayOfMonth INT,
    @Hour INT = 0,  -- based on 24 hour clock (add 12 for PM :)
    @Min INT = 0,
    @Sec INT = 0
)
RETURNS DATETIME
AS
BEGIN

    RETURN DATEADD(second, @Sec, 
            DATEADD(minute, @Min, 
            DATEADD(hour, @Hour,
            DATEADD(day, @DayOfMonth - 1, 
            DATEADD(month, @Month - 1, 
            DATEADD(Year, @Year-1900, 0))))))

END

GO

आप इसे इस तरह से कॉल कर सकते हैं ...

SELECT dbo.func_DateFromParts(2013, 10, 4, 15, 50, DEFAULT)

रिटर्न ...

2013-10-04 15:50:00.000

मान लीजिए y, m, d सभी int , कैसे के बारे में:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

कृपया SQL सर्वर 2012 और उसके बाद के लिए मेरा अन्य उत्तर देखें


मैं व्यक्तिगत रूप से सबस्ट्रिंग को पसंद करता हूं क्योंकि यह सफाई विकल्प और स्ट्रिंग को आवश्यकतानुसार विभाजित करने की क्षमता प्रदान करता है। धारणा यह है कि डेटा 'डीडी, मिमी, yyyy' प्रारूप का है।

--2012 and above
SELECT CONCAT (
        RIGHT(REPLACE(@date, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1)),2)
        )

--2008 and below
SELECT   RIGHT(REPLACE(@date, ' ', ''), 4)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), CHARINDEX(',', REPLACE(@date, ' ', '')) + 1, LEN(REPLACE(@date, ' ', '')) - CHARINDEX(',', REPLACE(@date, ' ', '')) - 5),2)
        +'-'
        +RIGHT('00'+SUBSTRING(REPLACE(@date, ' ', ''), 1, CHARINDEX(',', REPLACE(@date, ' ', '')) - 1),2)

यहां एक प्रदर्शन है कि डेटा को कॉलम में संग्रहीत किया जाता है, तो इसका मुकदमा कैसे किया जा सकता है। कहने की जरूरत नहीं है, कॉलम पर आवेदन करने से पहले परिणाम सेट को जांचना आदर्श है

DECLARE @Table TABLE (ID INT IDENTITY(1000,1), DateString VARCHAR(50), DateColumn DATE)

INSERT INTO @Table
SELECT'12, 1, 2007',NULL
UNION
SELECT'15,3, 2007',NULL
UNION
SELECT'18, 11 , 2007',NULL
UNION
SELECT'22 , 11, 2007',NULL
UNION
SELECT'30, 12, 2007  ',NULL

UPDATE @Table
SET DateColumn = CONCAT (
        RIGHT(REPLACE(DateString, ' ', ''), 4)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), CHARINDEX(',', REPLACE(DateString, ' ', '')) + 1, LEN(REPLACE(DateString, ' ', '')) - CHARINDEX(',', REPLACE(DateString, ' ', '')) - 5)),2)
        ,'-'
        ,RIGHT(CONCAT('00',SUBSTRING(REPLACE(DateString, ' ', ''), 1, CHARINDEX(',', REPLACE(DateString, ' ', '')) - 1)),2)
        ) 

SELECT ID,DateString,DateColumn
FROM @Table

यदि आपको दिनांक और समय दोनों भागों से डेटाटाइम की आवश्यकता है तो मैं एक-लाइन समाधान जोड़ता हूं:

select dateadd(month, (@Year -1900)*12 + @Month -1, @DayOfMonth -1) + dateadd(ss, @Hour*3600 + @Minute*60 + @Second, 0) + dateadd(ms, @Millisecond, 0)

या सिर्फ एक ही डेटड फ़ंक्शन का उपयोग करना:

DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011

SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)






tsql