SQL सर्वर में डेटटाइम 2 में दिनांक और समय को कैसे मिलाएं?


48

निम्नलिखित घटकों को दिया

DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'

DATETIME2(7)मूल्य के साथ परिणाम उत्पन्न करने के लिए उन्हें संयोजित करने का सबसे अच्छा तरीका क्या है '2013-10-13 23:59:59.9999999'?

कुछ चीजें जो काम नहीं करती हैं उन्हें नीचे सूचीबद्ध किया गया है।


SELECT @D + @T 

ऑपरेटर ऑपरेटर के लिए ऑपरेटर डेटा प्रकार की तारीख अमान्य है।


SELECT CAST(@D AS DATETIME2(7)) + @T 

ऑपरेटर ऑपरेटर टाइप डेटाटाइम 2 एड ऑपरेटर के लिए अमान्य है।


SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)

दिनांकित फ़ंक्शन के परिणामस्वरूप अतिप्रवाह हुआ। दो दिनांक / समय के उदाहरणों को अलग करने वाले दिनांक की संख्या बहुत बड़ी है। एक कम सटीक दिनांक के साथ डेटेडिफ का उपयोग करने का प्रयास करें।

* एज़्योर SQL डेटाबेस और SQL सर्वर 2016 में अतिप्रवाह से बचा जा सकता है DATEDIFF_BIG


SELECT CAST(@D AS DATETIME) + @T 

डेटा प्रकार डेटाटाइम और समय एड ऑपरेटर में असंगत हैं।


SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)

एक परिणाम देता है, लेकिन सटीक खो देता है 2013-10-13 23:59:59.997

जवाबों:


49

यह काम करता है और सटीक रखने के लिए भी लगता है:

SELECT DATEADD(day, DATEDIFF(day,'19000101',@D), CAST(@T AS DATETIME2(7)))

CASTकरने के लिए DATETIME2(7)धर्मान्तरित TIME(7)मूल्य ( @Tएक करने के लिए) DATETIME2जहां तिथि हिस्सा है '1900-01-01', जो दिनांक और दिनांक प्रकार के डिफ़ॉल्ट मान है (देखें datetime2और टिप्पणी * पर CASTऔरCONVERT पेज MSDN पर।)

* ... जब वर्ण डेटा जो केवल दिनांक या केवल समय घटकों का प्रतिनिधित्व करता है, उसे डेटाइम या स्माटलैडटाइम डेटा प्रकारों पर डाला जाता है, तो अनिर्दिष्ट समय घटक को 00: 00: 00.000 पर सेट किया जाता है , और अनिर्दिष्ट तिथि घटक 1900-01- पर सेट किया जाता है 01

DATEADD()और DATEDIFF()बाकी का कार्य ले देखभाल, यानी बीच के दिनों में अंतर को जोड़ने 1900-01-01और DATEमूल्य ( @D)।

टेस्ट: एसक्यूएल-फिडल


जैसा कि @Quandary द्वारा देखा गया है , उपरोक्त अभिव्यक्ति को SQL सर्वर द्वारा निर्धारक नहीं माना जाता है। हम एक नियतात्मक अभिव्यक्ति चाहते हैं, का कहना है कि क्योंकि यह एक के लिए प्रयोग की जाने वाली है PERSISTEDस्तंभ, '19000101'** द्वारा प्रतिस्थापित किया जा करने की जरूरत है 0या CONVERT(DATE, '19000101', 112):

CREATE TABLE date_time
( d DATE NOT NULL,
  t TIME(7) NOT NULL,
  dt AS DATEADD(day, 
                DATEDIFF(day, CONVERT(DATE, '19000101', 112), d), 
                CAST(t AS DATETIME2(7))
               ) PERSISTED
) ;

**: DATEDIFF(day, '19000101', d)के रूप में यह करने के लिए तार का एक अंतर्निहित रूपांतरण करता है निर्धारित करने योग्य नहीं है DATETIMEऔर तार से दिनांक के लिए रूपांतरण हैं नियतात्मक केवल जब विशिष्ट शैलियों किया जाता है।


8

मुझे पार्टी के लिए देर हो रही है, लेकिन @ ypercube के उत्तर के समान यह दृष्टिकोण, किसी भी स्ट्रिंग रूपांतरण (जो दिनांक रूपांतरणों से अधिक महंगा हो सकता है) का उपयोग करने की आवश्यकता से बचता है, निर्धारक है, और यदि एमएस कभी भी बदल जाता है, तो काम करना जारी रखना चाहिए डिफ़ॉल्ट तिथि मान 1900-01-01 (भले ही वे शायद इसे बदल नहीं सकते):

DECLARE @D DATE = SYSUTCDATETIME()
, @T TIME = SYSUTCDATETIME();

SELECT DATEADD(DAY, DATEDIFF(DAY, @T, @D), CONVERT(DATETIME2, @T));

सिद्धांत यह है कि डेटटाइम 2 और फिर तिथि करने के लिए समय मान को परिवर्तित करके, यह समय निकालता है और डिफ़ॉल्ट दिनांक असाइन करता है, आप दिन जोड़ने के लिए दिन प्राप्त करने के लिए अपने दिनांक मान के साथ इसे दिनांकित करते हैं, अपना समय डेटाइम 2 में जोड़ें और जोड़ें पर दिन


"DatedIFF (DAY, @T, @D)" के बजाय "DatedIFF (DAY, 0, @D)" होना चाहिए। परिणाम समान है, लेकिन भ्रम से बचने में मदद करता है। डेटडिफ़ (दिन, ...) सबसे कम दिनों की संख्या के लिए तर्क देता है, इसलिए @T को वैसे भी 0 में बदल दिया जाता है।
डेनिस गोरेलिक

5

SQL सर्वर 2012 और उसके बाद DATETIME2FROMPARTS फ़ंक्शन है। इसका यह रूप है:

DATETIME2FROMPARTS(year, month, day, hour, minute, seconds, fractions, precision)

दिए गए सैंपल डेटा के लिए यह बन जाता है

select Answer = DATETIME2FROMPARTS(2013, 10, 13, 23, 59, 59, 9999999, 7);

जिसके परिणामस्वरूप

Answer
---------------------------
2013-10-13 23:59:59.9999999

भागों को DATEPART () का उपयोग करके प्राप्त किया जा सकता है, यदि अस्थायी डेटाटाइप्स से शुरू किया जाता है, या प्रश्न में नमूना मूल्यों के निर्माण के लिए उपयोग किए गए पाठ से।


0

यह SQL सर्वर के अपने पहले उदाहरण को काम नहीं करने के लिए बहुत बेवकूफ है, और यह वास्तव में गूंगा लगता है, लेकिन ...

select convert(datetime2, convert(nvarchar(max), @d) + ' ' + convert(nvarchar(max), @t));

0
SELECT mydate=CAST(CAST(@D AS nvarchar(max)) + ' ' + 
                   CAST(@T AS nvarchar (max)) 
              AS DATETIME2);

5
क्या आपने इसका परीक्षण किया है? क्या यह काम करता है? क्या यह भाषा सेटिंग से प्रभावित है?
ypercube y

0

जब मैं यहां उतरा तो मैं कुछ और ढूंढ रहा था। सवाल बहुत पुराना है, लेकिन कुछ हालिया टिप्पणियाँ और गतिविधि हैं। सोचा था कि मैं एक सरल विधि साझा करूंगा, जो @Atario द्वारा दिए गए उत्तर के समान है, लेकिन थोड़ा छोटा है और कुछ को पढ़ने में आसान लग सकता है:

declare @d date = '2013-10-13'
declare @t time(7) = '23:59:59.9999999'

select cast(concat(@d, ' ', @t) as datetime2(7))

-3

आप DATE को ट्रंकट करने के लिए कलाकारों के साथ ट्रंकट कर सकते हैं, फिर TIME को जोड़ने के लिए DATETIME पर वापस

select CAST( cast(getdate() as date) as DATETIME)  + CAST(getdate() as TIME)

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