2013-02-27 223 views
7

मेरे पास एक कॉलम है जो डेटाटाइम प्रारूप में डेटा संग्रहीत करता है। मैं उन सभी मामलों की जांच करना चाहता हूं जहां इस कॉलम का समय हिस्सा 00: 00: 00: 000 के बराबर नहीं है - तिथि कोई फर्क नहीं पड़ता।डेटाटाइम फ़ील्ड पर केवल समय की जांच कैसे करें, लेकिन तारीख को अनदेखा करें?

मूल रूप से, अगर समय() एक समारोह, कुछ इस तरह था:

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

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

उत्तर

9

आपको केवल आपके पास पहले से ही एक मामूली चिमटा की आवश्यकता है।

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

उपयोग CONVERT अपने DATETIME एक TIME को बदलने के लिए।

SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000' 
+0

क्या इस विधि के साथ कोई सीमाएं/चिंताएं हैं? यह मेरे लिए अजीब लगता है कि यह प्रस्तावित होने में इतना लंबा लगा (अन्य उत्तरों के आधार पर) यदि यह वास्तव में सबसे अच्छा तरीका है? – Codingo

+0

@ माइकल इस तरह से कोई सीमा नहीं है, कम से कम अन्य उत्तरों की तुलना में नहीं।कॉलम पर फ़ंक्शंस को लागू करने के बारे में बुरी बात यह है कि उस कॉलम पर किसी भी इंडेक्स का उपयोग नहीं किया जा सकता है और एसक्यूएल सर्वर को एक पंक्ति स्कैन करना है ताकि आपको पता चल सके कि आपको किन पंक्तियों की आवश्यकता है। –

3

DATEDIFF और DATEADD का उपयोग करने के बजाय डेटाटाइम का दिनांक भाग प्राप्त करें। केवल तारीख के विरुद्ध कॉलम की तुलना करें, और यह उन पंक्तियों को वापस कर देगा जिनमें शून्य-शून्य समय है।

जिस तरह से यह काम करता है यह है कि हम पहली बार युग और मूल्य के बीच अंतर (दिनों में) की गणना करते हैं। हम उस डेटा को युग में एक नया डेटाटाइम बनाने के लिए जोड़ते हैं। चूंकि DATEDIFF का परिणाम एक पूर्णांक है, इसलिए किसी भी समय घटक गोलाकार हो जाता है।

SELECT * 
FROM Table 
WHERE DateColumn <> DATEADD(d, DATEDIFF(d, 0, DateColumn), 0) 

समय समारोह तो, निम्नलिखित द्वारा लागू किया जा सकता नहीं है कि मैं इस विशिष्ट परिदृश्य के लिए यह सलाह देते हैं:

SELECT DATEDIFF(minute, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay, 
    -- or, if you require higher precision 
    DATEDIFF(second, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay 
FROM Table 

संपादित करें: अन्य उत्तर में उल्लेख किया है, आप कर सकते हैं के समान प्रभाव प्राप्त करने के लिए DATE पर कास्ट करें, जो अच्छी तरह से साफ हो जाता है। हालांकि, DATE को केवल SQL Server 2008 में जोड़ा गया था, जबकि सूत्र में कम से कम SQL 2000 पर संगतता है। इसलिए यदि आपको पिछली संगतता की आवश्यकता है या SQL CE से निपट रहे हैं, तो DATE को कास्टिंग अनुपलब्ध है।

2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

एक और तरीका है, अलग अलग डेटाप्रकार करने के लिए इसे परिवर्तित करने के लिए है जैसे

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

मैं यह सब समय है जब देखने के लिए अगर एक तालिका की स्तंभ होना चाहिए की कोशिश कर करना एक डेटाटाइम की बजाय एक तिथि में बदल गया, जो वास्तव में जवाब है।

select * 
from progen.dy 
where cast(dy_date as Date) <> dy_date 

डाली समय निकल जाता है और datetime उच्च पूर्वता है, इसलिए जब तुलना में, अगर असमान हैं तो यह एक समय महत्व है। कुछ अलग-अलग वाक्यविन्यास के साथ, समय-समय पर कलाकारों के साथ भी किया जा सकता है।