2010-04-14 12 views
11

यदि मेरे पास दिनांक दिनांक 2010-03-01 17:34:12.018SQL सर्वर में किसी दिनांक को छोटा करने का सबसे अच्छा तरीका क्या है?

2010-03-01 00:00:00.000 में बदलने का सबसे प्रभावी तरीका क्या है?

द्वितीयक प्रश्न के रूप में, ओरेकल के TRUNC फ़ंक्शन का अनुकरण करने का सबसे अच्छा तरीका क्या है, जो आपको वर्ष, तिमाही, महीना, सप्ताह, दिन, घंटा, मिनट और दूसरी सीमाओं में छंटनी करने की अनुमति देगा?

+0

यहां एक अच्छा स्पष्टीकरण के साथ समान प्रश्न है: http://stackoverflow.com/questions/923295/how-to-truncate-a-datetime-in-sql-server – Alex

उत्तर

25

निकटतम पूरे दिन पर जाने के लिए, व्यापक उपयोग में तीन दृष्टिकोण हैं। 0 डेटाटाइम के दिनों की संख्या खोजने के लिए पहला व्यक्ति datediff का उपयोग करता है। 0 डेटाटाइम 1 जनवरी, 1 9 00 से मेल खाता है। प्रारंभ तिथि में दिन अंतर जोड़कर, आप पूरे दिन तक चले गए हैं;

select dateadd(d, 0, datediff(d, 0, getdate())) 

दूसरी विधि पाठ आधारित है: यह varchar(10) साथ पाठ वर्णन ट्रंकेटस, केवल तारीख हिस्सा छोड़ने:

select convert(varchar(10),getdate(),111) 

तीसरी विधि तथ्य यह है कि एक datetime वास्तव में एक चल बिन्दु का प्रतिनिधित्व करता है का उपयोग करता है 1 9 00 के बाद से दिनों की संख्या। इसलिए इसे पूरे नंबर पर गोल करके, उदाहरण के लिए floor का उपयोग करके, आपको दिन की शुरुआत मिलती है:

select cast(floor(cast(getdate() as float)) as datetime) 

अपने दूसरे प्रश्न का उत्तर देने के लिए, सप्ताह की शुरुआत ट्रिकियर है। एक तरह से घटाना है दिन के इस सप्ताह:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate()) 

यह भी एक समय हिस्सा देता है, तो आप पहली तारीख को पाने के लिए समय-अलग करना तरीकों में से एक के साथ संयोजित करना होगा । उदाहरण के लिए, @start_of_day पठनीयता के लिए एक चर के रूप में के साथ:

declare @start_of_day datetime 
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime) 
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day) 

वर्ष, माह, घंटे और मिनट अभी भी "1900 के बाद से अंतर" के साथ काम की शुरू दृष्टिकोण:

select dateadd(yy, datediff(yy, 0, getdate()), 0) 
select dateadd(m, datediff(m, 0, getdate()), 0) 
select dateadd(hh, datediff(hh, 0, getdate()), 0) 
select dateadd(mi, datediff(mi, 0, getdate()), 0) 

दूसरे द्वारा गोल करने के लिए एक अलग दृष्टिकोण की आवश्यकता होती है, क्योंकि 0 के बाद से सेकंड की संख्या एक अतिप्रवाह प्रदान करती है। कि चारों ओर एक तरह से, दिन की शुरुआत उपयोग कर रहा है 1900 के बजाय एक संदर्भ तारीख के रूप में: 5 मिनट द्वारा

declare @start_of_day datetime 
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime) 
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day) 

करने के लिए गोल, मिनट राउंडिंग विधि एडजस्ट करें। , मिनट के अंतर का भागफल लो /5*5 का उपयोग कर उदाहरण के लिए:

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0) 

यह रूप में अच्छी तरह क्वार्टर और आधे घंटे के लिए काम करता है।

+0

कौन सा सर्वश्रेष्ठ प्रदर्शन करने जा रहा है? –

+0

जहां तक ​​मुझे पता है, प्रदर्शन अंतर – Andomar

+0

मापने के लिए बहुत छोटा है, यही मैं भी जानना चाहता हूं !!! मैं अपने कोड में दूसरे का उपयोग करता हूं, लेकिन अगर मैं इसे करने का तेज़ तरीका था तो मैं उत्सुक था। पहला एक तीसरा फ़ंक्शन कॉल वाला दो दिनांक फ़ंक्शन है, इसलिए कम से कम तीन पार्सिंग ऑपरेशंस हैं, जबकि दूसरा एक प्रारूप है जो एक प्रारूप के साथ स्ट्रिंग करने के लिए है (लेकिन इसमें रगड़ है, पुस्तकालयों में क्या होता है?) .. – jcolebrand

2

प्रयास करें:

SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) 

अद्यतन: दूसरे प्रश्न पर जवाब: साल के लिए आप मेरा उत्तर का एक छोटा सा संशोधित संस्करण इस्तेमाल कर सकते हैं:

SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) 
तिमाही के लिए

:

SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) 

और इसी तरह।

मैंने चेक किया, मिनट तक - यह ठीक है। लेकिन सेकंड पर मैं एक अतिप्रवाह संदेश मिल गया है:

दो datetime कॉलम कार्यावधि में अतिप्रवाह के कारण होता है के अंतर।

एक और अद्यतन: ही question

15

के लिए निम्न जवाब देने के लिए एक बार देख ले आप एसक्यूएल सर्वर 2008 का उपयोग कर रहे हैं, तो आप नए Date डेटाप्रकार इस तरह उपयोग कर सकते हैं:

select cast(getdate() as date) 

यदि आपको अभी भी DateTime डेटाटाइप होने के लिए अपने मूल्य की आवश्यकता है, तो आप यह कर सकते हैं:

select cast(cast(getdate() as date) as datetime) 

एक विधि है कि SQL सर्वर के सभी संस्करणों पर काम करना चाहिए है:

select cast(floor(cast(getdate() as float)) as datetime) 
+0

मुझे यकीन है कि यह सबसे तेज़ है, अंकगणित से पूरी तरह से परहेज करता है। –

1

यह देर हो चुकी है, लेकिन पोस्ट में अनुरोध सटीक परिणाम देगा। मुझे यह भी लगता है कि यह डेटडैड का उपयोग करने से ज्यादा सहज है, लेकिन यह मेरी वरीयता है।

declare @SomeDate datetime = '2010-03-01 17:34:12.018' 
SELECT 
DATEFROMPARTS(
    YEAR(@SomeDate) 
    ,MONTH(@SomeDate) 
    ,'01' 
    ) AS CUR_DATE_FROM_PARTS 
,DATETIMEFROMPARTS(
    YEAR(@SomeDate)      
    ,MONTH(@SomeDate)     
    ,'01' --DAY(@SomeDate)     
    ,'00' --DATEPART(HOUR,@SomeDate)   
    ,'00' --DATEPART(MINUTE,@SomeDate)  
    ,'00' --DATEPART(SECOND,@SomeDate)  
    ,'00' --DATEPART(MILLISECOND,@SomeDate) 
    ) AS CUR_DATETIME_FROM_PARTS 
,@SomeDate       AS CUR_DATETIME 
,YEAR(@SomeDate)     AS CUR_YEAR 
,MONTH(@SomeDate)     AS CUR_MONTH 
,DAY(@SomeDate)     AS CUR_DAY 
,DATEPART(HOUR,@SomeDate)   AS CUR_HOUR 
,DATEPART(MINUTE,@SomeDate)  AS CUR_MINUTE 
,DATEPART(SECOND,@SomeDate)  AS CUR_SECOND 
,DATEPART(MILLISECOND,@SomeDate) AS CUR_MILLISECOND 
FROM Your_Table 

छंटनी की गई तिथि: 2010-03-01

छंटनी की गई दिनांक समय: 2010-03-01 00: 00: 00.000

दिनांक समय: 2010-03-01 17: 34: 12.017

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

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