2010-04-06 21 views
33

एसक्यूएल 2005 में, के बजाय dateparts वर्ष, माह और तारीख से एक प्रश्न के निर्माण,पंक्ति प्राप्त करें जहां datetime स्तंभ = आज - एसक्यूएल सर्वर noob

वहाँ जहां खंड लिखने की एक अधिक संक्षिप्त तरीका है?

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN 
    CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) 

CAST(GETDATE() AS DATE) दिनांक-केवल मान, उदा करने के लिए वर्तमान दिनांक और समय डाले:

+0

मैं सोच रहा हूं कि इनमें से कोई भी जवाब इसके मुकाबले कम है या नहीं। मुझे यह और भी पठनीय लगता है। जहां (DATEPART (yy, myColum) = '2010') और (DATEPART (मिमी, myColum) = '4') और (DATEPART (डीडी, myColum) = '7'); – Chin

+1

** @ चिन, आपकी विधि इंडेक्स उपयोग को रोक देगी, और इसके परिणामस्वरूप धीमी तालिका स्कैन हो जाएगी। ** मैं अत्यधिक अनुशंसा करता हूं कि आप उस विधि का उपयोग करके किसी तारीख के आधार पर खोज न करें। आपको सीमा में तिथियों को "मंजिल" करने की आवश्यकता है, और यदि आप किसी इंडेक्स का उपयोग करना चाहते हैं तो कॉलम पर कोई फ़ंक्शन लागू नहीं करें। यह एक डेटाटाइम को फ़्लोर करने का तरीका है: http://stackoverflow.com/questions/85373/floor-a-date-in-sql-server –

+0

@ केएम, इसके लिए धन्यवाद। मैंने सोचा कि मैं पूछूंगा और देखूंगा कि मैं आधार से बाहर था या नहीं। वर्तमान में मैं इस कॉलम पर एक इंडेक्स से अनजान हूं। मैं इसे ध्यान में रखूंगा हालांकि मेरी तिथियों के अनुसार मैंने सुझाव दिया है। – Chin

उत्तर

22

को एसक्यूएल 2000 और SQL 2005 में बदल सकते हैं, तो आप एक DATETIME से समय घटक को दूर करने, यानी एक अच्छा चयन कथन का उपयोग कर सकते हैं

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

6 वापस आ जाएगी -एप्र -2010 (केवल आज के लिए)।

तो marc_s के जवाब के साथ संयुक्त, आप चाहते हैं

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 0) 
AND DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1) 

संपादित करें:, आवश्यकताओं के अनुरूप दूसरे DATEADD में ध्यान दें 1 (इस दिन यह शुरू से ही 1 करने के लिए किया गया है कहते हैं (बजाय बदली गई 0), यह 7 वीं अप्रैल 2010 00:00:00) आप 6 चाहते हैं अप्रैल 23:59:59 आप एक दूसरी दूसरी तारीख से दूर ले

DATEADD(ss,-1,'My DateTime') 

अंतिम कॉल बन जाएगा

DATEADD(ss,-1,DATEADD(dd, DATEDIFF(dd,0,'MY Date and Time, But I Only Want Date'), 1)) 

ठीक है कि एक बार में बहुत सारी जानकारी है! आशा है कि यह सब समझ :)

+0

मुझे आपकी अभिव्यक्ति की तुलना में तारीख-केवल एक हिस्सा प्राप्त करने के लिए आपकी अभिव्यक्ति पसंद है - लेकिन यह चयन काम नहीं करेगा, नहीं ?? यदि आपके पास '2010-04-06 15:15:15' है - तो यह तुलना करने के लिए बस उस तारीख की तुलना कैसे की जा रही है ?? मुझे लगता है कि आपको उन सभी मूल्यों को आजकल उन सभी मूल्यों को पकड़ने के लिए चयन करें, जहां से उनसे जुड़ा हुआ है .... –

+1

यदि आप इंडेक्स को पूरी तरह से नष्ट करना चाहते हैं तो आपको 'कहां दिनांक दिनांक (आज) और (आज + 1 दिन)' चुनने की आवश्यकता है। , आप DateAalue पर DateAdd/DatePart का उपयोग कर सकते हैं, लेकिन यह एक बुरा विचार है! (यदि आपके पास अच्छी अनुक्रमणिका है :)) – PostMan

+0

मेरे पास समय है जो 23: 59: 59.000 और 00: 00: 00.000 के बीच है, अगले दिन रिपोर्ट से हटा दिया गया। तो मैं कभी भी "एक दूसरी विधि घटाना" का उपयोग नहीं करूंगा। 00: 00: 000.000 पर समय रखना और एक दिन में वृद्धि करना बेहतर है और बस (<"कम से कम" <"का उपयोग करें (आपका कॉलम <फ़्लोरर्ड एंड रेंजडेटाइम + 1) –

25

एसक्यूएल सर्वर 2008 पर, आप जो आप इस लक्ष्य को हासिल करने के लिए इस्तेमाल कर सकते हैं एक नया DATE डेटा प्रकार, के लिए होता है 6 अप्रैल, 2010 के लिए '2010-04-06' वापस लौटें। उस दिन एक दिन जोड़ना मूल रूप से आज के सभी डेटाटाइम मूल्यों का चयन करता है।

SELECT (list of fields) 
FROM dbo.YourTable 
WHERE dateValue BETWEEN 
    CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME) AND 
    DATEADD(DAY, 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)) 
+0

@marc_s - क्या आपने अभी अपना जवाब हटा दिया है? जब मैं एक टिप्पणी जोड़ने की कोशिश कर रहा था तो मुझे बाहर निकाल दिया। अगर मैं केवल अपग्रेड करता हूं। आपकी मदद के लिए धन्यवाद हालांकि बहुत सराहना की। – Chin

+0

@Chin: हाँ, मेरे पास पहले एक मूर्ख जवाब था, इसे हटा दिया गया, इसे संपादित किया गया, और इसे फिर से हटाया गया :-) –

+0

@marc_s: आप निश्चित रूप से "सुरुचिपूर्ण" शब्द की एक अपमानित परिभाषा है, +1 :) –

1

इस

की तर्ज पर कुछ: सबसे सुरुचिपूर्ण समाधान I found here DATETIME का सांख्यिक हेरफेर उपयोग कर रहा है एक ही परिणाम प्राप्त करने के लिए -

SQL सर्वर 2005 में, वहाँ यह करने के लिए आसान नहीं है

CONVERT(date,tbldata.date)=CONVERT(date,getdate()) 

यह मानता है कि तिथि कॉलम में समय भी शामिल है। यह नहीं तो आप इसके

tbldata.date=CONVERT(date,getdate()) 
+0

एसक्यूएल सर्वर 2005 में 'डेट' प्रकार है? ;) –

+0

बाहर निकलता है यह नहीं करता है। मेरा वर्तमान स्टैक एसक्यूएल सर्वर 2008 है जब से हम अपग्रेड किए गए हैं और मुझे लगता है कि 2005 में यह सुविधा थी। –

4

नहीं अच्छा प्रदर्शन है, लेकिन एक समाधान बनाता है:

SELECT * 
FROM tblDate 
WHERE CONVERT(VARCHAR, date, 112) = CONVERT(VARCHAR, GETDATE(), 112); 

यदि यह एक आम क्वेरी एक गणना स्तंभ केवल साल के महीने दिन सामग्री के साथ जोड़ा जाना चाहिए है।

+0

आप सही हैं, यह धीमा हो जाएगा, क्योंकि कोई इंडेक्स –

0

मैं एसक्यूएल के लिए वापस जा datetime स्तंभों पर यह करने के लिए एक यूडीएफ का उपयोग किया है 2000.

CREATE FUNCTION [dbo].[GETDATENOTIME](@now datetime) 
RETURNS smalldatetime 
AS 
BEGIN 
    RETURN (CONVERT(smalldatetime, CONVERT(varchar, @now, 112))) 
END 

उपयोग:

DECLARE @date smalldatetime 
SET @date = '4/1/10' 
SELECT * FROM mytable WHERE dbo.GETDATENOTIME(date) = @date 

नहीं दुनिया में सबसे कुशल बात (YMMV पर निर्भर करता है आपकी मेज) लेकिन यह नौकरी करता है।उन टेबलों के लिए जहां मुझे पता है कि मैं बिना किसी समय के आधार पर चयन करूँगा, मेरे पास विशेष रूप से डिफ़ॉल्ट रूप से dbo.GETDATENOTIME (GETDATE()) के लिए एक कॉलम होगा।

+1

नहीं होगा आपके पास "डेट" कॉलम पर कभी भी एक इंडेक्स था, यह निश्चित रूप से इसका उपयोग करने में सक्षम नहीं होगा और इस प्रकार एक टेबल स्कैन होगा .... –

+0

इसलिए अंत में मेरा अस्वीकरण। ओपी ने संक्षिप्त वाक्यविन्यास के लिए कहा, इसलिए यही वह जवाब है जिसे मैंने उसे दिया था। – Dane

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