SQL सर्वर में डेटाटाइम के समय भाग को हटाने के लिए सबसे अच्छा तरीका




sql-server tsql (19)

SQL सर्वर 2008 में, आप इसका उपयोग कर सकते हैं:

CONVERT(DATE, getdate(), 101)

SQL सर्वर में डेटाटाइम फ़ील्ड से समय भाग को हटाते समय कौन सी विधि सर्वोत्तम प्रदर्शन प्रदान करती है?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

या

b) select cast(convert(char(11), getdate(), 113) as datetime)

दूसरी विधि कुछ और बाइट्स को किसी भी तरह से भेजती है लेकिन यह रूपांतरण की गति जितनी महत्वपूर्ण नहीं हो सकती है।

दोनों भी बहुत तेज़ प्रतीत होते हैं, लेकिन सैकड़ों हजार या उससे अधिक पंक्तियों से निपटने पर गति में अंतर हो सकता है?

साथ ही, क्या यह संभव है कि एसक्यूएल में डेटाटाइम के समय हिस्से से छुटकारा पाने के लिए और भी बेहतर तरीके हैं?


मैं वास्तव में पसंद करता हूं:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)

120 प्रारूप कोड आईएसओ 8601 मानक में तारीख को मजबूर करेगा:

'YYYY-MM-DD' or '2017-01-09'

Dplyr ( R ) और पांडा ( Python ) में उपयोग करने के लिए सुपर आसान!


select cast(cast my_datetime_field as date) as datetime) बारे में कैसे select cast(cast my_datetime_field as date) as datetime) ? इसका परिणाम उसी तारीख में होता है, 00:00 पर सेट समय के साथ, लेकिन पाठ में किसी भी रूपांतरण से बचाता है और किसी भी स्पष्ट संख्यात्मक गोलाकार से बचाता है।


कन्वर्ट का चयन करें (चार (10), गेटडेट (), 126)


पहली जगह में आवेषण / अपडेट पर पट्टी का समय। ऑन-द-फ्लाई रूपांतरण के लिए, उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन रखरखाव-योग्यता को कुछ भी हरा नहीं सकता है:

select date_only(dd)

date_only का कार्यान्वयन आपको कुछ भी पसंद हो सकता है - अब यह संक्षिप्त हो गया है और कोड कोड बहुत अधिक क्लीनर है।


बेशक यह एक पुराना धागा है लेकिन इसे पूरा करने के लिए।

एसक्यूएल 2008 से आप DATE डेटाटाइप का उपयोग कर सकते हैं ताकि आप बस कर सकें:

SELECT CONVERT(DATE,GETDATE())

SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)

SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

मै इस्तेमाल करूंगा:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
) 

इस प्रकार आपके पास पहले से मौजूद दिनांक फ़ील्ड से प्रभावी रूप से एक नया क्षेत्र बना रहा है।


कड़ाई से, विधि कम से कम संसाधन गहन है:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

समान कुल अवधि के लिए कम सीपीयू गहन साबित होता है, किसी के द्वारा दस लाख पंक्तियों को उनके हाथों पर बहुत अधिक समय लगता है: SQL सर्वर में दिनांक से तारीख प्राप्त करने के लिए सबसे प्रभावी तरीका + समय?

मैंने इसी तरह के परिणामों के साथ कहीं और एक समान परीक्षण देखा।

मैं DATEADD / DATEDIFF पसंद करता हूं क्योंकि:

  • वर्कर भाषा / डेटफॉर्मेट मुद्दों के अधीन है
    उदाहरण: मेरा केस अभिव्यक्ति गैर-निर्धारक क्यों है?
  • फ्लोट आंतरिक भंडारण पर निर्भर करता है
  • यह "0" आधार बदलकर महीने के पहले दिन, कल आदि काम करने के लिए फैलता है

संपादित करें, अक्टूबर 2011

SQL सर्वर 2008+ के लिए, आप date CAST कर सकते हैं। या बस date उपयोग करें ताकि निकालने का कोई समय न हो।

संपादित करें, जनवरी 2012

यह एक उदाहरण है कि यह कितना लचीला है: एसक्यूएल सर्वर में गोलाकार समय या दिनांक आकृति द्वारा गणना करने की आवश्यकता है

संपादित करें, मई 2012

WHERE क्लॉज में इसका उपयोग न करें और बिना किसी सोच के: किसी कॉलम में फ़ंक्शन या CAST जोड़ना इंडेक्स उपयोग को अमान्य कर देता है। यहां नंबर 2 देखें: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

अब, इसमें सीएएसटी को सही ढंग से प्रबंधित करने के बाद के SQL सर्वर ऑप्टिमाइज़र संस्करणों का एक उदाहरण है, लेकिन आम तौर पर यह एक बुरा विचार होगा ...


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

इस मामले में:

[Microsoft.SqlServer.Server.SqlFunction]
    public static SqlDateTime DateOnly(SqlDateTime input)
    {
        if (!input.IsNull)
        {
            SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);

            return dt;
        }
        else
            return SqlDateTime.Null;
    }


मेरे लिए नीचे दिया गया कोड हमेशा एक विजेता है:

SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));

बस अगर कोई यहां साइबेस संस्करण के लिए देख रहा है क्योंकि उपरोक्त कई संस्करण काम नहीं करते हैं

CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
  • एसक्यूएल v11 में परीक्षण किया गया है अनुकूली सर्वर 15.7 पर चल रहा है

सावधान!

विधि ए) और बी) हमेशा एक ही आउटपुट नहीं है!

select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)

आउटपुट: 2014-01-01 00:00:00.000

select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)

आउटपुट: 2013-12-31 00:00:00.000

(एमएस एसक्यूएल सर्वर 2005 और 2008 आर 2 पर परीक्षण किया गया)

संपादित करें: एडम की टिप्पणी के अनुसार, यह तब नहीं हो सकता है जब आप तालिका से दिनांक मान पढ़ते हैं, लेकिन यह तब हो सकता है जब आप अपना दिनांक मान शाब्दिक के रूप में प्रदान करते हैं (उदाहरण: एडीओ.NET के माध्यम से संग्रहीत एक संग्रहीत प्रक्रिया के पैरामीटर के रूप में)।


SQL सर्वर 2008 में, एक दिनांक डेटाटाइप (एक टाइम डेटाटाइप भी है)।

CAST(GetDate() as DATE)

या

declare @Dt as DATE = GetDate()

यहां मैंने SQL सर्वर के लिए डेटाटाइम के कुछ हिस्सों को हटाने के लिए एक फ़ंक्शन बनाया है। उपयोग:

  • पहला परम छीनने का समय है।
  • दूसरा पैरा एक char है:
    • एस: सेकंड से दौर; मिलीसेकंड हटा देता है
    • मी: मिनटों के लिए दौर; सेकंड और मिलीसेकंड हटा देता है
    • एच: घंटों तक दौर; मिनट, सेकंड और मिलीसेकंड हटा देता है।
    • डी: दिनों के लिए दौर; घंटे, मिनट, सेकंड और मिलीसेकंड हटा देता है।
  • नया डेटाटाइम देता है

create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end


मुझे लगता है कि आप cast(floor(cast(getdate()as float))as datetime) मतलब है cast(floor(cast(getdate()as float))as datetime)

असली केवल 32-बिट्स है, और कुछ जानकारी खो सकता है

यह सबसे तेज़ cast(cast(getdate()+x-0.5 as int)as datetime)

... हालांकि केवल 10% तेज (about 0.49 microseconds CPU vs. 0.58)

यह अनुशंसा की गई थी, और अभी मेरे परीक्षण में एक ही समय लेता है: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

एसक्यूएल 2008 में, एसक्यूएल सीएलआर फ़ंक्शन एक एसक्यूएल फ़ंक्शन का उपयोग करने से लगभग 5 गुना तेज है, 1.3 माइक्रोसॉंड्स बनाम 6.5 माइक्रोसॉक्शन पर, एक सरल एसक्यूएल यूडीएफ बनाम एसक्यूएल सीएलआर फ़ंक्शन के लिए बहुत कम फ़ंक्शन-कॉल ओवरहेड इंगित करता है।

एसक्यूएल 2005 में, एसक्यूएल सीएलआर फ़ंक्शन 16 बार तेज है, मेरे परीक्षण के अनुसार, इस धीमे फ़ंक्शन के विरुद्ध:

create function dateonly (  @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end

मुझे लगता है कि अगर आप सख्ती से TSQL साथ चिपके रहते हैं कि यह समय कम करने का सबसे तेज़ तरीका है:

 select convert(datetime,convert(int,convert(float,[Modified])))

मुझे इस DateAdd विधि को DateAdd विधि से लगभग 5% तेज DateAdd । और इसे इस तरह के निकटतम दिन में आसानी से संशोधित किया जा सकता है:

select convert(datetime,ROUND(convert(float,[Modified]),0))






date