এসকিউএল সার্ভারের ডেটটাইম পছন্দ হয়?


92

মাইএসকিউএলে

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

এসকিউএল সার্ভারের সিনট্যাক্সটি কী?


আপনি আসলে কি পরীক্ষা করতে চান? যে একটি নির্দিষ্ট তারিখের একটি নির্দিষ্ট তারিখের অংশ আছে? অথবা অন্য কিছু?
ক্রিস জে

4
এ সম্পর্কে স্বাস্থ্যকর আলোচনার জন্য ( DATETIMEস্ট্রিংয়ের মতো মানগুলি কেন খারাপ ব্যবহার করা এবং এটি ব্যবহারে কেন খারাপ হতে পারে BETWEENবা তা সহ >= AND <=), অ্যারন বারট্র্যান্ডের এই ব্লগটি দেখুন ।
অ্যারন বারট্রান্ড

আপনার প্রশ্নের মতো লাইক-অপারেটর ট্যাগের 5জন্য কমপক্ষে ভোট রয়েছে । আমি দয়া করে অনুরোধ করতে পারি যে আপনি প্রতিশব্দ হিসাবে sql- মত প্রস্তাব ?
কেরমিট

উত্তর:


138

আপনি তারিখ পার্ট () ফাংশনটি ব্যবহার করতে পারেন

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

আমি এই পদ্ধতিটি পড়ার পক্ষে সহজ মনে করি কারণ এটি সময়ের উপাদানটিকে উপেক্ষা করে এবং আপনার বাছাইকে সীমাবদ্ধ রাখতে আপনাকে পরের দিনের তারিখটি ব্যবহার করতে হবে না। আপনি যথাযথ ডেট পার্ট কোড ব্যবহার করে অতিরিক্ত ক্লজ যুক্ত করে বৃহত্তর বা কম গ্রানুলারিটিতে যেতে পারেন eg

AND    DATEPART(hh, register_date) = 12)

12 এবং 1 এর মধ্যে তৈরি রেকর্ড পেতে।

বৈধ আর্গুমেন্টের সম্পূর্ণ তালিকার জন্য এমএসডিএন তারিখ পার্টস ডক্সের সাথে পরামর্শ করুন ।


যদি রেজিস্টার_ডেটে কোনও সূচক থাকে তবে এটি সূচকটিকে সম্পূর্ণ উপেক্ষা করবে এবং কার্য সম্পাদন ক্ষতিগ্রস্থ হবে। সম্ভবত বেশ খারাপভাবে।
ক্রিস জে

ঠিক আছে, তবে এটি প্রশ্নের উত্তর দেওয়ার পরের দিনটির সমতুল্য স্ট্রিংটি ব্যবহার করার সমস্যা এড়াতে পারে না, যা এখানে কয়েকটি উত্তরের পরামর্শে দেওয়া হচ্ছে। কৌশলটি যেখানে প্রশ্নে তারিখটি মাস বা বছরের শেষ হয়।
র‌্যাল্ফ ল্যাভেল

60

DATETIME ভেরিয়েবলের বিপরীতে লাইক অপারেটরের জন্য সরাসরি সমর্থন নেই তবে আপনি সর্বদা DATETIME কে একটি VARCHAR এ কাস্ট করতে পারেন:

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

কনভার্ট ফাংশনে উপলব্ধ "স্টাইল" এর সম্পূর্ণ তালিকার জন্য এমএসডিএন ডক্স পরীক্ষা করে দেখুন ।

মার্ক


4
সম্মত হয়েছে - তবে ওপি লাইকের সাথে ডেটটাইম হ্যান্ডেল করার জন্য একটি উপায়ের অনুরোধ করেছে .... তবে আমি সম্মত হই - ডেটটাইমগুলি অবশ্যই> = এবং <= বা
বিটওয়িন

ধন্যবাদ সবাইকে. দুঃখিত আমি এসকিউএল এর জন্য কেবল নবাগত।
পাইসাল

4
সচেতন থাকুন, এমএসএসকিউএল ২০১২ (আমার ধারণা পুরানো সংস্করণগুলিও) ডেটটাইমটিকে '2014-01-06T16: 18: 00.045' হিসাবে বারচরে রূপান্তর করবে, তাই আপনি যদি ঘন্টা / মিনিটও মেলে চেষ্টা করেন তবে এটি মনে রাখবেন।
ব্যালিন্ট

উপরের স্ক্যুয়ালটি নির্বাচন করার সাথে আমার একমাত্র সমস্যাটি হ'ল: 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টেবিল স্ক্যানের পরিবর্তে সূচকটি (যদি সেখানে থাকে তবে ) ব্যবহারের অনুমতি দেবে ।


ধন্যবাদ. দুঃখিত আমি এসকিউএল এর জন্য কেবল নবাগত।
পাইসাল

8

আপনি পাঠ্য আকারে তারিখ পেতে কনভার্ট ব্যবহার করতে পারেন। যদি আপনি এটিকে একটি ভারচারে রূপান্তর করেন (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'> =
নিবন্ধন_ তারিখ

@ এমআর_এক্লেয়ার: এমনটি ভাবেন না, এতে 11 ই অক্টোবরের আগে প্রতিটি তারিখ অন্তর্ভুক্ত থাকবে
এন্ডোমার

8

দুর্ভাগ্যক্রমে, 'লাইক' ব্যবহার করে বারচারের সাথে ডেটটাইম তুলনা করা সম্ভব নয় তবে কাঙ্ক্ষিত আউটপুট অন্য উপায়ে সম্ভব।

    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


2

এটা চেষ্টা কর

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

1

এসকিউএল সার্ভারে তারিখগুলির জন্য LIKE অপারেটরের একটি খুব ফ্ল্যাঙ্ক কভারেজ রয়েছে। এটি কেবল আমেরিকান তারিখের ফর্ম্যাট ব্যবহার করে কাজ করে। উদাহরণ হিসাবে আপনি চেষ্টা করতে পারেন:

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

আমি এটি এসকিউএল সার্ভার 2005 এ পরীক্ষা করেছি এবং এটি কাজ করে, তবে আপনাকে সত্যই বিভিন্ন সংমিশ্রণ চেষ্টা করতে হবে। অদ্ভুত জিনিস আমি লক্ষ্য করেছি:

  • আপনি কেবলমাত্র তারিখের মধ্যে বিভিন্ন উপক্ষেত্রের জন্য সমস্ত কিছু না কিছু পেয়েছেন বলে মনে হচ্ছে, উদাহরণস্বরূপ, আপনি যদি 'এপ্রিল 2%' অনুসন্ধান করেন তবে কেবলমাত্র 20 এর দশকে কিছু পাওয়া যাবে - এটি ২ য় এর বাদ পড়ে।

  • একটি একক আন্ডারস্কোর ব্যবহার _ 'একটি একক (ওয়াইল্ডকার্ড) চরিত্র প্রতিনিধিত্ব করতে বিলকুল কাজ, উদাহরণস্বরূপ, নেই WHERE mydate LIKE 'oct _ 2010%'হবে না সকল তারিখ আসতে সামনে 10th - এটা সব সময়ে কিছুই ফেরৎ, আসলে!

  • ফর্ম্যাটটি কঠোর আমেরিকান: ' mmm dd yyyy hh:mm'

লাইকিং সেকেন্ডের জন্য প্রক্রিয়াটি পেরেক করা আমার পক্ষে কঠিন হয়ে পড়েছে, তাই যদি কেউ এটিকে আরও কিছুটা এগিয়ে নিতে চান তবে আমার অতিথি হোন!

আশাকরি এটা সাহায্য করবে.


1

আমি এই থ্রেডটি থেকে একটু দেরি করেছি তবে আসলে এমএস এসকিউএল সার্ভারে লাইক অপারেটরের জন্য সরাসরি সমর্থন রয়েছে।

LIKE সাহায্যে নথিভুক্ত হিসাবে যদি ডেটাটাইপটি স্ট্রিং না হয় তবে এটিকে স্ট্রিনে রূপান্তরিত করার চেষ্টা করা হয়। এবং নিক্ষিপ্ত হিসাবে নথি হিসাবে ডকুমেন্টেশন রূপান্তর:

স্ট্রিং-এ ডিফল্ট ডেটটাইম রূপান্তরটি টাইপ হয় 0 (, 100) যা সোম ডিডি ইয়াই এইচ: মিয়াম (বা প্রধানমন্ত্রী)।

আপনার যদি ডিবিতে এই জাতীয় তারিখ থাকে:

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'

আপনি যে সারি পেতে।

যাইহোক, এই তারিখের ফর্ম্যাটটি প্রস্তাব দেয় যে এটি একটি ডেটটাইম 2 , তারপরে ডকুমেন্টেশন বলে:

21 বা 121 - ওডিবিসি ক্যানোনিকাল (মিলিসেকেন্ড সহ) সময়, তারিখ, তারিখের সময় 2 এবং ডেটটাইমসেটের জন্য ডিফল্ট। - ইয়ে-মিমি-ডিডি এইচ: মাইল: এসএসএমএমএম (24 ঘন্টা)

এটি এটিকে সহজ করে তোলে এবং আপনি এটি ব্যবহার করতে পারেন:

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%';

স্ট্রিংয়ে কোনও রূপান্তর ছাড়াই এসকিউএল সার্ভারে ডেটটাইম অনুসন্ধান করা সর্বদা সমস্যাযুক্ত। প্রতিটি তারিখের অংশ পাওয়া একটি ওভারকিল (যা সম্ভবত কোনও সূচক ব্যবহার করে)। সম্ভবত আপনি যখন স্ট্রিং রূপান্তর ব্যবহার করবেন না তখন আরও ভাল উপায় হ'ল রেঞ্জ চেক ব্যবহার করা। অর্থাত:

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

0

আমি আমার সমস্যাটি সেভাবেই সমাধান করেছি। উন্নতির জন্য পরামর্শের জন্য আপনাকে ধন্যবাদ। সি # তে উদাহরণ।

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 + "%'";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.