2010-01-04 13 views
8

में डेटटाइम डेटा प्रकार के समय भाग की तुलना करें I SQL Server 2005 में डेटटाइम डेटा प्रकार के केवल समय हिस्से की तुलना कैसे कर सकता हूं? उदाहरण के लिए, मैं उन सभी रिकॉर्ड्स प्राप्त करना चाहता हूं जिनमें MyDateField एक विशिष्ट समय के बाद है। निम्नलिखित उदाहरण यह करने का एक बहुत लंबा और संभवतः तेज़ तरीका नहीं है। मैं सभी तिथियों चाहते हैं, जहां MyDateField है 12 से अधिक: 30: 50,400SQL सर्वर 2005

SELECT * 
FROM Table1 
WHERE  ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) = 50) AND (DATEPART(millisecond, MyDateField) > 400)) 
     OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) = 30) AND (DATEPART(second, MyDateField) > 50)) 
     OR ((DATEPART(hour, MyDateField) = 12) AND (DATEPART(minute, MyDateField) > 30)) 
     OR ((DATEPART(hour, MyDateField) > 12)) 
+0

ध्यान दें कि यदि आपको वास्तव में तिथि और समय को अलग से संसाधित करने की आवश्यकता है, तो आप प्रभावी ढंग से सामान्यीकरण नियमों को तोड़ रहे हैं। डेटटाइम मान दिनांक पर समय पर एक विशिष्ट बिंदु है। एक तिथि और समय एक बहु-मूल्यवान क्षेत्र है, जिसे तोड़ा जाना चाहिए था। आपका कोड धीमा चलने का कारण यह है कि आपने इसे सही ढंग से सामान्य नहीं किया है। –

+0

@Lasse - आप इसे कितना दूर ले लेंगे? निश्चित रूप से आप तारीख को संग्रहीत करने के बजाय अलग-अलग क्षेत्रों में दिन, महीना, वर्ष, घंटा, मिनट, सप्ताहांत, सप्ताहांत, तिमाही, सप्ताह स्टोर नहीं करते हैं। – JeffO

+0

@Lasse - बेशक मैं दिनांक और समय फ़ील्ड में डेटटाइम फ़ील्ड को अलग कर सकता हूं। लेकिन फिर मुझे तारीख और समय दोनों की तुलना करने के लिए एक ही समस्या होगी। –

उत्तर

10
SELECT * 
FROM Table1 
WHERE DATEADD(day, -DATEDIFF(day, 0, MyDateField), MyDateField) > '12:30:50.400' 
+0

मुझे लगता है कि यह अब तक का सबसे अच्छा समाधान है। यह स्पष्ट है, और समझने में आसान है। इसके अलावा यह केवल क्वेरी के संबंध में सबसे तेज़ समाधान है, डीबी संरचना नहीं। –

5

यह कैसे के बारे में?

SELECT (fields) 
FROM dbo.YourTable 
WHERE DATEPART(HOUR, MyDate) >= 12 
    AND DATEPART(MINUTE, MyDate) >= 23 
    AND DATEPART(SECOND, MyDate) >= 45 

घंटे 24 घंटे के प्रारूप में दिया गया है, उदाहरण के लिए 12 का मतलब है 12 घंटे दोपहर, 15 मतलब 3 बजे।

DATEPART में मिनटों, सेकंड और आगे के लिए "भाग" भी हैं। आप निश्चित रूप से अपने WHERE खंड में उन तारीख भागों में से कई का उपयोग कर सकते हैं जैसा आप चाहें।

+0

यदि दोपहर का कट ऑफ है तो तर्क शायद 'घंटा> = 12' या शायद' घंटा> 12 या (घंटा = 12 और मिलीसेकंद> 0) होना चाहिए। – LukeH

+0

@ ल्यूक: अच्छा बिंदु, हाँ - मेरा उपयोग करना था = = .... –

+0

लेकिन मैं समय के अन्य हिस्सों पर भी विचार नहीं करना चाहता, न केवल घंटे। –

-1

परिवर्तित (varchar (10), MyDate, 108)

यह आपको प्रारूप एचएच का समय स्ट्रिंग देता: MM: SS।

तो आप किसी भी तुलना में आप इसे

+0

समय भाग भी मिलीसेकंड संलग्न करता है ... क्या कोई प्रारूप है जो पूर्णकालिक भाग भी देता है? जो मैं खोज रहा हूं, वह केवल समय छोड़ने वाले दिनांक भाग को बाहर करने का एक तरीका है। –

1

मुझे क्या करना चाहता था के साथ चाहते हैं कर सकते हैं दिनांक समय डेटा प्रकार के समय भाग निकालने, और यह तुलना करने के लिए है। मुझे StackOverflow में दिनांक भाग निकालने का एक तरीका मिला। अगर मैं तारीख हिस्सा अकेले है, यह सिर्फ स्रोत DATETIME से तारीख घटाना है:

datePortion = DATEADD (दिन, DateDiff (दिन, 0, sourceDate), 0)
timePortion = DateDiff (मिलीसेकंड, datePortion, sourceDate)

तो मैक्रो SQL सर्वर 2005 में समय भाग को निकालने के लिए है:

f (x) = DateDiff (मिलीसेकंड, DATEADD (दिन, DateDiff (दिन, 0, sourceDate), 0), स्रोत दिनांक)

अब क्वेरी दिनांक समय मैदान के समय भाग तुलना करने के लिए, 12 के साथ: 30: 50.400 है:

SELECT * 
FROM Table1 
WHERE 
     DATEDIFF(millisecond, DATEADD(day, DATEDIFF(day, 0, DateTimeField), 0), DateTimeField) 
     > 
     DATEDIFF(millisecond, DATEADD(day, DATEDIFF(day, 0, '1900-01-01T12:30:50.400'), 0), '1900-01-01T12:30:50.400') 

मैं प्रश्नों के अन्य प्रकार घटाव ऑपरेटर का उपयोग भी शामिल है, के खिलाफ इस क्वेरी का परीक्षण किया है ('-'), और कन्वर्ट। निष्पादन योजना तुलना इंगित करती है कि यह करने का यह सबसे तेज़ तरीका है। मैंने क्वेरी निष्पादन के वास्तविक समय का भी परीक्षण किया ... कोई ध्यान देने योग्य सबसे तेज विधि नहीं है।

+0

प्रदर्शन को बेहतर बनाने के लिए, क्वेरी को बेहतर बनाने के लिए, यदि आप इसे यूडीएफ में टॉस करते हैं तो यह एक बहुत अच्छा समाधान है। इस तरह आप इसे 'WHERE dbo.GetTime (MyDateField)> = @ कुछ समय' के रूप में लिख सकते हैं। – Aaronaught

+0

शुरुआत में मैं सोच रहा था कि क्या मैं केवल क्वेरी को बदलकर अधिक प्रदर्शन प्राप्त कर सकता हूं। यह संभव है, लेकिन इतना नहीं, 2% से कम। मैं GetTime समारोह खोजने में असमर्थ था। –

1

दूसरों क्वेरी बनाने के वैकल्पिक तरीकों को तैनात किया है, लेकिन मैं कुछ करने के लिए प्रतिक्रिया करने के लिए चाहते हैं आप पहले पैराग्राफ में कहते हैं:

निम्न उदाहरण एक बहुत लंबा और करने का शायद तेजी से नहीं तरीका है इस।

अभिनय की दृष्टि से, यह वास्तव में अगर आप एक DATEPART या 10 DATEPARTS वहाँ में है कोई फर्क नहीं पड़ता; तथ्य यह है कि आपके पास एक DATEPART भी है जो प्रदर्शन को चोट पहुंचाने वाला है।

यदि आपको समय पर तुलना करने की आवश्यकता है लेकिन तारीख नहीं है, तो लास की टिप्पणी पैसे पर सही है - आपको अलग दिनांक/समय कॉलम में सामान्यीकृत करने की आवश्यकता है। वास्तव में, एसक्यूएल 2008 date और time प्रकारों का परिचय देता है और अनुशंसा करता है कि आप datetime के बजाय उनका उपयोग करें। आपके पास SQL ​​2005 में यह नहीं है, लेकिन आप समय-समय पर एक टिक फ़ील्ड के साथ इसके आसपास काम कर सकते हैं, और चेक बाधा जो दिनांक कॉलम के सभी दिनांकों को शून्य पर बल देती है।

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

+0

आप पूरी तरह से सही हैं! =) मैंने सवाल पूछा, क्योंकि मैं जानना चाहता था कि इसे कैसे हल किया जाए, जिस तरह से यह डीबी को बदलने के बिना है। असल में सभी QUERY-only समाधान एक ही गति क्रम हैं, सभी अभी भी धीमे होने जा रहे हैं ... मैंने अभी इसका परीक्षण किया है ... लेकिन DATEADD और DATEDIFF का उपयोग करना सबसे खराब है। –