SQL सर्वर डेटाइम का चयन करें?


92

MySQL में

select * from record where register_date like '2009-10-10%'

SQL Server में वाक्य रचना क्या है?


आप वास्तव में क्या जांचना चाहते हैं? कि किसी दिए गए डेटाइम में एक निश्चित तिथि भाग होता है? या कुछ और?
क्रिस जे

1
इस पर एक स्वस्थ चर्चा के लिए (जिसमें DATETIMEस्ट्रिंग्स जैसे मूल्यों का इलाज करना बुरा क्यों है, और इसका उपयोग करना BETWEENया क्यों बुरा हो सकता है >= AND <=), इस ब्लॉग को आरोन बर्ट्रेंड द्वारा देखें ।
हारून बर्ट्रेंड

आपके प्रश्न में कम से कम 5वोट हैं जैसे ऑपरेटर टैग के लिए। क्या मैं आपसे निवेदन कर सकता हूं कि आप एक पर्याय के रूप में sql- जैसा सुझाव दें ?
करमीत

जवाबों:


138

आप DATEPART () फ़ंक्शन का उपयोग कर सकते हैं

SELECT * FROM record 
WHERE  (DATEPART(yy, register_date) = 2009
AND    DATEPART(mm, register_date) = 10
AND    DATEPART(dd, register_date) = 10)

मुझे यह पढ़ने में आसान लगता है, क्योंकि यह समय घटक की उपेक्षा करता है, और आपको अपने चयन को प्रतिबंधित करने के लिए अगले दिन की तारीख का उपयोग करने की आवश्यकता नहीं है। आप उपयुक्त DatePart कोड का उपयोग करके, अतिरिक्त क्लॉज़ जोड़कर अधिक या कम ग्रैन्युलैरिटी पर जा सकते हैं

AND    DATEPART(hh, register_date) = 12)

12 और 1 के बीच रिकॉर्ड बनाने के लिए।

मान्य तर्कों की पूरी सूची के लिए MSDN DATEPART डॉक्स से परामर्श करें ।


अगर register_date पर कोई इंडेक्स है, तो यह इंडेक्स को पूरी तरह से नजरअंदाज कर देगा और प्रदर्शन को नुकसान होगा। शायद काफी बुरी तरह से।
क्रिस जे

ठीक है, लेकिन यह सवाल में तारीख के बाद दिन के स्ट्रिंग स्ट्रिंग का उपयोग करने की समस्या से बचता है, जो यहां कुछ उत्तरों में सुझाया जा रहा है। मुश्किल जहां सवाल में तारीख महीने, या वर्ष के अंत है।
राल्फ लावेल

59

DATETIME चर के खिलाफ LIKE ऑपरेटर के लिए कोई प्रत्यक्ष समर्थन नहीं है, लेकिन आप हमेशा DATETIME को किसी VCHCHCH को दे सकते हैं:

SELECT (list of fields) FROM YourTable
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%'

CONVERT फ़ंक्शन में उपलब्ध "शैलियों" की पूरी सूची के लिए MSDN डॉक्स की जाँच करें ।

न घुलनेवाली तलछट


1
सहमति - लेकिन ओपी की तरह साथ दिनांक को संभालने के लिए एक तरह से अनुरोध किया .... लेकिन मैं सहमत हूँ - बहुत अच्छा दृष्टिकोण - datetimes अधिमानतः तरह> = और <= या बीच रहता है के साथ संभाला जाना चाहिए
marc_s

आप सभी को धन्यवाद। क्षमा करें, मैं SQL के लिए एक नौसिखिया हूँ।
पायल

1
ज्ञात हो, MSSQL 2012 (मुझे पुराने संस्करणों का भी अनुमान है) डेटाइम को '2014-01-06T16: 18: 00.045' के रूप में परिवर्तित करेगा, इसलिए यदि आप घंटे / मिनट के लिए भी मिलान करने का प्रयास करते हैं, तो इसे ध्यान में रखें।
बाल्ट

उपरोक्त sql चयन के साथ मेरे पास एकमात्र मुद्दा यह है: WHERE CONVERT(VARCHAR(25), register_date, 25) LIKE '2009-10-10%'
गेब्रियल मारियस पोपस्कु

10

यदि आप ऐसा करते हैं, तो आप इसे स्ट्रिंग रूपांतरण करने के लिए मजबूर कर रहे हैं। प्रारंभ / समाप्ति तिथि सीमा बनाना बेहतर होगा, और उपयोग करें:

declare @start datetime, @end datetime
select @start = '2009-10-10', @end = '2009-11-10'
select * from record where register_date >= @start
           and register_date < @end

यह इसे register_dateटेबल स्कैन के बजाय इंडेक्स (यदि कोई एक है ) का उपयोग करने की अनुमति देगा ।


धन्यवाद। क्षमा करें, मैं SQL के लिए एक नौसिखिया हूँ।
पायस

7

टेक्स्ट फॉर्म में तारीख पाने के लिए आप CONVERT का उपयोग कर सकते हैं। यदि आप इसे एक varchar (10) में परिवर्तित करते हैं, तो आप इसके बजाय = का उपयोग कर सकते हैं:

select *
from record
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10'

या आप एक ऊपरी और निचली सीमा तिथि का उपयोग कर सकते हैं, अतिरिक्त लाभ के साथ कि यह एक सूचकांक का उपयोग कर सकता है:

select *
from record
where '2009-10-10' <= register_date
and register_date < '2009-10-11'

मुझे लगता है कि जहां क्लॉज है वहां टाइपो है, यह "जहां" 2009-10-10 '> = register_date'
विश्वनाथ दलवी

@mr_eclair: ऐसा मत सोचो, कि 11 अक्टूबर से पहले हर तारीख शामिल होगी
Andomar

7

दुर्भाग्य से, 'LIKE' का उपयोग करके varchar की ओर डेटाइम की तुलना करना संभव नहीं है, लेकिन वांछित आउटपुट दूसरे तरीके से संभव है।

    select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0

3

आप LIKE का उपयोग करके डेट को खोजने योग्य बनाने के लिए कन्वर्ट का भी उपयोग कर सकते हैं। उदाहरण के लिए,

select convert(VARCHAR(40),create_date,121) , * from sys.objects where     convert(VARCHAR(40),create_date,121) LIKE '%17:34%'

2

LIKEऑपरेटर महीने या तारीख की तरह तिथि भागों के साथ काम नहीं करता है, लेकिन DATEPARTऑपरेटर करता है।

उन सभी खातों का पता लगाने की आज्ञा दें जिनकी ओपन डेट 1 तारीख को थी:

SELECT * 
  FROM Account 
 WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1`

* कास्टिंग OpenDtक्योंकि यह मूल्य में है DATETIMEऔर न सिर्फ DATE


1

SQL सर्वर में दिनांक के लिए LIKE ऑपरेटर की बहुत परतदार कवरेज है। यह केवल अमेरिकी दिनांक प्रारूप का उपयोग करके काम करता है। एक उदाहरण के रूप में आप कोशिश कर सकते हैं:

... WHERE register_date LIKE 'oct 10 2009%'

मैंने इसे SQL Server 2005 में परीक्षण किया है और यह काम करता है, लेकिन आपको वास्तव में विभिन्न संयोजनों की कोशिश करनी होगी। अजीब बातें मैंने देखा है:

  • आप केवल दिनांक के भीतर विभिन्न उप क्षेत्रों के लिए सभी या कुछ भी प्राप्त करने लगते हैं, उदाहरण के लिए, यदि आप 'apr 2%' की खोज करते हैं, तो आपको केवल 20 वें में कुछ भी मिलता है - यह 2nd का लोप करता है।

  • एक भी अंडरस्कोर का उपयोग करते हुए '_' एक भी (वाइल्डकार्ड) चरित्र का प्रतिनिधित्व करने के लिए पूरी तरह काम करते हैं, उदाहरण के लिए, यह नहीं है WHERE mydate LIKE 'oct _ 2010%'जाएगा नहीं सभी तिथियों लौटने से पहले 10 वीं - यह सब पर कुछ भी नहीं देता है, वास्तव में!

  • प्रारूप कठोर अमेरिकी है: ' mmm dd yyyy hh:mm'

मुझे LIKEing सेकंड के लिए एक प्रक्रिया को बंद करना मुश्किल हो गया है, इसलिए यदि कोई इसे थोड़ा आगे ले जाना चाहता है, तो मेरे मेहमान बनें!

उम्मीद है की यह मदद करेगा।


1

मुझे इस धागे में थोड़ी देर हो गई है, लेकिन वास्तव में एमएस SQL ​​सर्वर में समान ऑपरेटर के लिए प्रत्यक्ष समर्थन है।

LIKE मदद में दस्तावेज के रूप में अगर डेटाटाइप एक स्ट्रिंग नहीं है तो इसे स्ट्रिंग में बदलने का प्रयास किया जाता है। और कास्ट / कन्वर्ट प्रलेखन में दस्तावेज के रूप में:

डिफ़ॉल्ट डेटाइम रूपांतरण स्ट्रिंग में टाइप 0 (और, 100) है जो मोन डीडी yyyy hh: miAM (या PM) है।

यदि आपके पास डीबी में इस तरह की तारीख है:

2015-06-01 11:52:59.057

और आप इस तरह से प्रश्न करते हैं:

select * from wws_invoice where invdate like 'Jun%'
select * from wws_invoice where invdate like 'Jun 1%'
select * from wws_invoice where invdate like 'Jun 1 %'
select * from wws_invoice where invdate like 'Jun 1 2015:%'
select * from wws_invoice where invdate like 'Jun ? 2015%'
...
select * from wws_invoice where invdate like 'Jun 1 2015 11:52AM'

आप उस पंक्ति को प्राप्त करें।

हालाँकि, यह दिनांक प्रारूप बताता है कि यह DateTime2 है , फिर प्रलेखन कहता है:

21 या 121 - ओडीबीसी विहित (मिलीसेकंड के साथ) समय, तिथि, डेटाइम 2 और डेटाइमऑफ़सेट के लिए डिफ़ॉल्ट। - yyyy-mm-dd hh: mi: ss.mmm (24h)

यह आसान बनाता है और आप उपयोग कर सकते हैं:

select * from wws_invoice where invdate like '2015-06-01%'

और चालान रिकॉर्ड प्राप्त करें। यहाँ एक डेमो कोड है:

DECLARE @myDates TABLE (myDate DATETIME2);
INSERT INTO @myDates (myDate)
VALUES
('2015-06-01 11:52:59.057'),
('2015-06-01 11:52:59.054'),
('2015-06-01 13:52:59.057'),
('2015-06-01 14:52:59.057');

SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59%';
SELECT * FROM @myDates WHERE myDate LIKE '2015-06-01 11:52:59.054%';

स्ट्रिंग के लिए किसी भी रूपांतरण के बिना SQL सर्वर में डेटाटाइम खोज करना हमेशा समस्याग्रस्त रहा है। प्रत्येक दिनांक भाग को प्राप्त करना एक ओवरकिल है (जो कि संभवत: एक सूचकांक का उपयोग नहीं करेगा)। जब आप स्ट्रिंग रूपांतरण का उपयोग नहीं करते हैं तो संभवतः एक बेहतर तरीका रेंज चेक का उपयोग करना होगा। अर्थात:

select * from record 
where register_date >= '20091010' and register_date < '20091011';

1

इसे इस्तेमाल करे

SELECT top 10 * from record WHERE  IsActive = 1 and CONVERT(VARCHAR, register_date, 120) LIKE '2020-01%'

0

मैंने अपनी समस्या को उस तरह से हल किया। सुधार के लिए सुझाव के लिए धन्यवाद। C # में उदाहरण।

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.