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




sql-server tsql (16)

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)

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

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

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


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

CAST(GetDate() as DATE)

या

declare @Dt as DATE = GetDate()

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

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 सर्वर ऑप्टिमाइज़र संस्करणों का एक उदाहरण है, लेकिन आम तौर पर यह एक बुरा विचार होगा ...


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


पहले ही उत्तर दिया गया है लेकिन बीमार इसे भी बाहर फेंक देता है ... यह आश्चर्यजनक रूप से अच्छी तरह से पूर्ववत करता है लेकिन यह फ्लोट से दशमलव (जो समय स्टोर करता है) को फेंक कर काम करता है और केवल पूरे भाग को लौटाता है (जो कि तारीख है)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

दूसरी बार मुझे यह समाधान मिला ... मैंने इस कोड को पकड़ लिया


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

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

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

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

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

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

मुझे लगता है कि आप 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

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

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

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


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

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

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

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

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


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

इस मामले में:

[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 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 के माध्यम से संग्रहीत एक संग्रहीत प्रक्रिया के पैरामीटर के रूप में)।


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


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

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




date