T-SQL डेटाइम कार्यों का उपयोग करने के साथ निकटतम मिनट और निकटतम घंटे तक चला गया


113

SQL सर्वर 2008 में, मैं चाहूंगा कि डेटाइम कालम को निकटतम घंटे और निकटतम मिनट के लिए अधिमानतः 2008 में मौजूदा कार्यों के साथ प्राप्त किया जाए।

इस स्तंभ मान के लिए 2007-09-22 15:07:38.850, आउटपुट जैसा दिखेगा:

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour

6
क्या निकटतम मिनट का उदाहरण 15:08 नहीं होना चाहिए? क्योंकि एक मिनट में सेकंड 60 है ...
OMG Ponies

क्या आपने जानबूझकर उस त्रुटि को ठीक नहीं किया जब आपने उसका प्रश्न संपादित किया ताकि आप उस टिप्पणी कर सकें?
श्री बुधवार

@MrWednesday आपको लगता है कि संपादन और उस टिप्पणी के बीच 10 मिनट से अधिक हैं। मैंने सोचा था कि बाद में सोचा होगा।
एलसी।

जवाबों:


208
declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

वापस होगा

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

उपरोक्त बस कुछ सेकंड और मिनटों को काटता है, जिससे प्रश्न में पूछे गए परिणाम उत्पन्न होते हैं। जैसा कि @OMG पॉनीज़ ने बताया, यदि आप राउंड अप / डाउन करना चाहते हैं, तो आप क्रमशः आधा मिनट या आधा घंटा जोड़ सकते हैं, फिर अलग करें:

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

और आपको मिलेगा:

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

SQL Server 2008 में दिनांक डेटा प्रकार जोड़े जाने से पहले , मैं उपरोक्त विधि का उपयोग केवल तिथि प्राप्त करने के लिए डेटटाइम से समय भाग को छोटा करने के लिए करूँगा। विचार प्रश्न में डेटाइम के बीच दिनों की संख्या और समय में एक निश्चित बिंदु निर्धारित करने के लिए है ( 0जो, संक्षेप में 1900-01-01 00:00:00.000)

declare @days int
set @days = datediff(day, 0, @dt)

और फिर समय के उस दिन को निश्चित बिंदु पर जोड़ दें, जो आपको निर्धारित समय के साथ मूल तिथि प्रदान करता है 00:00:00.000:

select dateadd(day, @days, 0)

या अधिक सफलतापूर्वक:

select dateadd(day, datediff(day, 0, @dt), 0)

एक अलग DatePart का उपयोग करना (जैसे hour, mi) तदनुसार काम करेंगे।


2
मुझे संदेह है कि कोई अन्य इसमें भाग लेगा, लेकिन यदि आप उत्तर प्रदेश को निकटतम दूसरे और 500 मिलीसेकंड पर जोड़ने का प्रयास कर रहे हैं तो आप दिनांकित (दूसरा, '1/1/2000', .... बनाम दिनांकित) करना चाहेंगे। (दूसरा, 0 ... जैसा कि आप एक अतिप्रवाह त्रुटि प्राप्त करेंगे। 0 से सेकंड बहुत बड़ा है मुझे लगता है।
एरिक ट्विलेगर

'1 जनवरी 1900 से लेकर जनवरी 1, 1900 तक घंटों की संख्या जोड़ें' - मैंने इसे जावा / एसक्यूएल में देखा, जहां यह बदसूरत दिखता है। मेरे मामले में यह वास्तव में जावा की तरफ होना चाहिए था।
कॉर्विन न्युएल

के साथ संगणना के लिए datetimeoffset, मुझे परिणाम पर स्थानीय समय क्षेत्र को मजबूर करने से बचने के लिए स्थानापन्न 0करना पड़ा TODATETIMEOFFSET('1900-01-01 00:00:00', 0)
krlmlr

26

आपके उदाहरण के अनुसार "गोल" नीचे। यह दिनांक का एक varchar मान लौटाएगा।

DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'

SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15

CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
चरचर

10

मुझे एहसास है कि यह सवाल प्राचीन है और एक स्वीकृत और एक वैकल्पिक उत्तर है। मुझे यह भी एहसास है कि मेरा उत्तर केवल आधे प्रश्न का उत्तर देगा, लेकिन किसी को भी निकटतम मिनट में गोल करना चाहते हैं और अभी भी केवल एक ही फ़ंक्शन का उपयोग करके एक डेटाइम संगत मान है :

CAST(YourValueHere as smalldatetime);

घंटों या सेकंड के लिए, ऊपर जेफ ओगाटा के उत्तर (स्वीकृत उत्तर) का उपयोग करें।


1
बहुत बढ़िया जवाब, मैंने सत्यापित किया है कि यह गोल नहीं है और सिर्फ छोटा नहीं है। इस विकल्प में देख किसी और के लिए, smalldatetimeएसक्यूएल 2008 में जोड़ा गया था
BradC

यह सबसे अच्छा विकल्प है अगर आपको अपनी तालिका में कुछ डेटा को ठीक करने की आवश्यकता है जो केवल मिनट के लिए समय की आवश्यकता है।
एन्क्रिप्शन

-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

00 सेकंड के लिए नीचे दौर होगा


बहुत धीमी गति से, और ओपी के पूछे जाने पर राउंड ऑफ नहीं करता है, लेकिन नीचे राउंड करता है, जिसके लिए उसने नहीं पूछा। (डिस्क्लेमर - मैंने आपको वोट नहीं दिया)
उलट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.