Microsoft SQL सर्वर में केवल दिनांक का उपयोग करके DATETIME फ़ील्ड को कैसे क्वेरी करें?


88

मेरे पास एक DATETIMEफ़ील्ड के साथ एक तालिका परीक्षण है , जैसे:

ID NAME DATE
1 TESTING 2014-03-19 20:05:20.000

मुझे इस पंक्ति और प्रत्येक पंक्ति को दिनांक 03/19/2014 को लौटाने वाली क्वेरी की आवश्यकता है, चाहे कोई भी समय हो। मैंने प्रयोग करने की कोशिश की

select * from test where date = '03/19/2014';

लेकिन यह कोई पंक्तियाँ नहीं लौटाता है। यह काम करने का एकमात्र तरीका जो मुझे मिला वह यह है कि दिनांक का समय भाग भी प्रदान करें:

select * from test where date = '03/19/2014 20:03:02.000';

जवाबों:


126

उपयोग रेंज, या DateDiff फ़ंक्शन

 select * from test 
 where date between '03/19/2014' and '03/19/2014 23:59:59'

या

 select * from test 
 where datediff(day, date, '03/19/2014') = 0

अन्य विकल्प हैं:

  1. यदि आपके पास डेटाबेस स्कीमा पर नियंत्रण है, और आपको समय डेटा की आवश्यकता नहीं है, तो इसे बाहर निकालें।

  2. या, यदि आप इसे रखना चाहते हैं, तो एक संगणित कॉलम विशेषता जोड़ें जिसमें दिनांक मान का समय भाग छीन लिया गया हो ...

Alter table Test Add DateOnly As DateAdd(day, datediff(day, 0, date), 0)

या, SQL सर्वर के हाल के संस्करणों में ...

Alter table Test Add DateOnly As Cast(DateAdd(day, datediff(day, 0, date), 0) as Date)

फिर, आप अपनी क्वेरी बस के रूप में लिख सकते हैं:

select * from test 
where DateOnly = '03/19/2014'

ठीक है, यह काम करता है, लेकिन मैं सोच रहा था कि क्या कोई आसान तरीका है।
डेलफिर्यूल्स

खैर, एकमात्र आसान तरीका डेटाबेस में समय डेटा को पहली जगह में रखना नहीं है ... या एक गणना की गई विशेषता बनाएं जो समय भाग को स्ट्रिप्स करता है और इसका उपयोग करता है ... मैंने अपने उत्तर में दोनों विकल्प जोड़े।
चार्ल्स ब्रेटाना

मैं चिंतित था कि दिनांकित विधि 4/19/2014 या 3/19/2015 की तारीखों के लिए सही (अवांछनीय) लौटेगी, क्योंकि उन तारीखों का 'दिन' भाग एक ही है (और मैंने रिपोर्ट कहीं और देखी थी कि यह इस तरह से कार्य करें), लेकिन मैंने इसे एक डेटाबेस के खिलाफ परीक्षण किया, और यह सही ढंग से काम करने लगता है।
मोनो कोदिगो

हां, क्योंकि DateDiff()फ़ंक्शन, इसके सभी प्रकारों में, तिथि सीमाओं की संख्या की गणना और रिटर्न करता है जिन्हें एक तारीख से दूसरी तारीख तक प्राप्त करने के लिए पार किया जाना चाहिए। यही कारण है DateDiff(day, '1Jan2016', '31Dec2017 23:259:59')और DateDiff(day, '31Dec2016 23:259:59', '1Jan2017 ') दोनों लौटते हैं 1
चार्ल्स ब्रेटाना

55

सरल उत्तर;

select * from test where cast ([date] as date) = '03/19/2014';

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

20

मैं MySQL 5.6 का उपयोग कर रहा हूं और दिनांक समय से केवल दिनांक भाग निकालने के लिए DATE फ़ंक्शन है। तो सवाल का सरल समाधान है -

 select * from test where DATE(date) = '2014-03-19';

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html


2
सवाल sql सर्वर के बारे में है
Kiquenet

7
select * from test 
where date between '03/19/2014' and '03/19/2014 23:59:59'

यह वास्तव में बुरा जवाब है। दो कारणों से।

1. 23.59.59.700 आदि जैसे समय के साथ क्या होता है। 23:59:59 और अगले दिन कई बार बड़े होते हैं।

2. व्यवहार डेटाटाइप पर निर्भर करता है। क्वेरी डेटाइम / डेट / डेटटाइम 2 प्रकारों के लिए अलग तरह से व्यवहार करती है।

23: 59: 59.999 के साथ परीक्षण करना इसे और भी खराब बनाता है क्योंकि डेटाटाइप के आधार पर आपको अलग-अलग दौर मिलते हैं।

select convert (varchar(40),convert(date      , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime  , '2014-03-19 23:59:59.999'))
select convert (varchar(40),convert(datetime2 , '2014-03-19 23:59:59.999'))

- तारीख के लिए मान 'कटा हुआ' है। - डेटाइम के लिए वैल्यू को अगली तारीख तक राउंड किया जाता है। (निकटतम मूल्य)। - डेटाइम 2 के लिए मान सटीक है।


7

यह मेरे लिए MS SQL सर्वर के लिए काम करता है:

select * from test
where 
year(date) = 2015
and month(date) = 10
and day(date)= 28 ;

1

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

 select * from test where Convert(varchar, date,111)= '03/19/2014'

1

आप यह कोशिश कर सकते हैं

select * from test where DATEADD(dd, 0, DATEDIFF(dd, 0, date)) = '03/19/2014';

1
धन्यवाद, लेकिन मुझे लगता है कि सरल समाधान समय की तुलना में पिछले समाधान की तरह होगा।
डेलफिर्यूल्स

0

आप इस दृष्टिकोण का उपयोग कर सकते हैं जो समय भाग को काटता है:

select * from test
where convert(datetime,'03/19/2014',102) = DATEADD(dd, DATEDIFF(dd, 0, date), 0)

0
-- Reverse the date format
-- this false:
    select * from test where date = '28/10/2015'
-- this true:
    select * from test where date = '2015/10/28'

1
कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें!
१६:१६ बजे ρss

यह काम नहीं करता क्योंकि '2015/10/28 00: 00.001' '2015/10/28' से अलग है
PedroC88

0

बस अपने WHEREखंड में इस का उपयोग करें ।

नीचे "SubmitDate" भाग कॉलम नाम है, इसलिए अपना खुद का डालें।

यह परिणाम के केवल "वर्ष" भाग को लौटाएगा, मिनटों को छोड़ देगा आदि।

Where datepart(year, SubmitDate) = '2017'

0
select *, cast ([col1] as date) <name of the column> from test where date = 'mm/dd/yyyy'

"col1" दिनांक और समय के साथ कॉलम का नाम है
<कॉलम का नाम> यहां आप वांछित के रूप में नाम बदल सकते हैं


0
select *
  from invoice
 where TRUNC(created_date) <=TRUNC(to_date('04-MAR-18 15:00:00','dd-mon-yy hh24:mi:ss'));

0

तारीखों और भाषाओं के साथ एक समस्या है और इससे बचने का तरीका इस प्रारूप YYYYMMDD के साथ तारीखों के लिए पूछ रहा है।

नीचे दिए गए लिंक के अनुसार यह तरीका सबसे तेज़ होना चाहिए। मैंने SQL Server 2012 में जाँच की और मैं लिंक से सहमत हूँ।

select * from test where date >= '20141903' AND date < DATEADD(DAY, 1, '20141903');

0

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

select * from TableName where DateTimeField > date() and  DateTimeField < date() + 1

-1

इस क्वेरी का परीक्षण करें।

SELECT *,DATE(chat_reg_date) AS is_date,TIME(chat_reg_time) AS is_time FROM chat WHERE chat_inbox_key='$chat_key' 
                         ORDER BY is_date DESC, is_time DESC

-1
select * from invoice where TRANS_DATE_D>= to_date  ('20170831115959','YYYYMMDDHH24MISS')
and TRANS_DATE_D<= to_date  ('20171031115959','YYYYMMDDHH24MISS');

मुझे लगता है कि यह ओरेकल सिंटैक्स है, एसक्यूएल सर्वर पर काम न करें
सीवनमार्ट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.