এসকিউএল "এর মধ্যে" অন্তর্ভুক্ত নয়


136

আমার এই জাতীয় একটি প্রশ্ন আছে:

SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'

1 ম এর ডেটা থাকলেও এটি কোনও ফল দেয় না।

created_at দেখতে 2013-05-01 22:25:19 , সময়ের সাথে এর কি সম্পর্ক আছে? এটি কীভাবে সমাধান করা যায়?

আমি আরও বড় তারিখের ব্যাপ্তিগুলি করি তবে এটি ঠিক কাজ করে তবে এটি (অন্তর্ভুক্ত) একক তারিখের সাথেও কাজ করা উচিত।


23
ঠিক আছে, 1 এবং 1 এর মধ্যে কতটি সংখ্যা রয়েছে? 1.5 কি 1 এবং 1 এর মধ্যে হওয়া উচিত? তারিখ / সময়সীমার জন্য কেবল বিটউইইন ব্যবহার করবেন না। কখনো। এবং সতর্কতা অবলম্বন করুন আপনি কীভাবে "ঠিকঠাক কাজ করেন" - কী আপনি শেষ দিন থেকে পরিসীমাটিতে ফলাফলগুলি ঘনিষ্ঠভাবে পর্যবেক্ষণ করেছেন? আপনি কেবলমাত্র সমস্ত সারি অন্তর্ভুক্ত করবেন যদি তাদের সাথে কোনও সময় যুক্ত না হয়।
অ্যারন বারট্রান্ড 21

হারুনের জন্য আপডেট হওয়া ইউআরএল: sqlblog.org/2011/10/19/…
জয়রিজ্জা

উত্তর:


294

এটা তোলে হয় সমেত। আপনি তারিখের সাথে তারিখের সাথে তুলনা করছেন। দ্বিতীয় তারিখটি মধ্যরাত হিসাবে ব্যাখ্যা করা হয় যখন দিন শুরু হয়

এটির সমাধানের একটি উপায়:

SELECT *
FROM Cases
WHERE cast(created_at as date) BETWEEN '2013-05-01' AND '2013-05-01'

এটি ঠিক করার আরেকটি উপায় হ'ল সুস্পষ্ট বাইনারি তুলনা with

SELECT *
FROM Cases
WHERE created_at >= '2013-05-01' AND created_at < '2013-05-02'

অ্যারন বারট্রান্ডের তারিখগুলিতে ( এখানে ) একটি দীর্ঘ ব্লগ এন্ট্রি রয়েছে , যেখানে তিনি এই এবং অন্যান্য তারিখের সমস্যাগুলি নিয়ে আলোচনা করেন।


15
এই ভাল উত্তরের সম্পূর্ণতার জন্য, আমি dateaddপরের দিনটি ব্যবহার করার পরামর্শ দেব ।
টিম লেহনার 21

7
@ টিমলহনার একটি উত্তরের উত্তরের জন্য, আমি '20130501' এর আইএসও -8601 ফর্ম্যাটটি ব্যবহার করতাম। ডেটফর্ম্যাট ডিএমআই সহ অ মার্কিন-জনগণের জন্য, আপনি এটি পান:set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
রিচার্ডকিউই

2
@ রিচার্ড দ্যকিউই - আমি বিশ্বাস করি যে সুস্পষ্ট বিটটি একটি প্রান্তটি ( >=) একটি প্রান্তে বন্ধ হয়ে এবং অন্য প্রান্তে ( ) <নির্ধারিত শেষের তারিখের বাইরে একদিন যাচাইয়ের জন্য ব্যবহার করছে।
HABO

3
@ স্কটব ব্যক্তিগতভাবে, আমি ডেটটাইম সহ ক্লাসটি প্রদর্শন, রফতানি, আমদানি বা লেখার জন্য প্রতিবার ডেটটাইমগুলিতে রূপান্তর করতে পেরে বিরক্তিকর মনে করব। আমি মনে করি এসকিউএল সার্ভারের বেশিরভাগ উদ্দেশ্যগুলির জন্য ডেটটাইমগুলি পরিচালনা ও তুলনা করার জন্য প্রচুর অন্তর্নির্মিত কার্যকারিতা রয়েছে।
টিম লেহনার

10
দফাটিতে আপনার কখনই কলাম কাস্ট করা উচিত নয় where, কারণ এটি কোনও সূচী হারাবে। এটি সত্যিই খারাপ প্যাটার্ন।
বুজিনাস

49

ধারণা করা হয়েছে BETWEENসিনট্যাক্সের দ্বিতীয় তারিখের রেফারেন্সটিকে যাদুকরীভাবে "দিনের শেষ" হিসাবে বিবেচনা করা হয় তবে এটি অসত্য

অর্থাৎ এটি প্রত্যাশিত ছিল:

মামলা থেকে * নির্বাচন করুন 
কোথায় হয় তাকে created_at শুরুতে '2013-05-01' এবং শেষে '2013-05-01'

তবে আসলে যা ঘটে তা হ'ল:

মামলা থেকে * নির্বাচন করুন 
2013-05-01 00: 00: 00 + 00000 'এবং' 2013-05-01 00: 00: 00 + 00000 'এর
 মধ্যে কোথায় তৈরি হয়েছে_আর

যা এর সমতুল্য হয়:

মামলাগুলি থেকে নির্বাচন করুন যেখানে তৈরি_এটি = '2013-05-01 00: 00: 00 + 00000 '

সমস্যা অনুভূতি / প্রত্যাশা সম্পর্কে এক BETWEENযা নেই উভয় নিম্ন মান এবং সীমার মধ্যে উচ্চতর মান মধ্যে রয়েছে, তবে না জাদুর করা একটি তারিখ বা "শেষ" "শুরুতে"।

BETWEEN তারিখের সীমা অনুসারে ফিল্টার করার সময় এড়ানো উচিত।

সর্বদা>= AND < পরিবর্তে ব্যবহার করুন

মামলা থেকে * নির্বাচন করুন 
যেখানে (তৈরি_আট > = '20130501' এবং তৈরি_এটি < '20130502')

প্রথম বন্ধনী এখানে optionচ্ছিক তবে আরও জটিল প্রশ্নের ক্ষেত্রে গুরুত্বপূর্ণ হতে পারে।


2
প্রশ্নের উত্তর ইতিমধ্যে জবাব দেওয়ার পরে এটি ভাল পোস্ট করার বুদ্ধি সম্পর্কে নিশ্চিত না হলেও আমি কিছুটা আলাদা পয়েন্টটি
চাপতে

5
সম্পাদকদের কাছে; দয়া করে সিউডো এসকিউএলকে কোড ব্লকে পরিণত করার চেষ্টা করবেন না, মন্তব্যটি বোল্ডের উপর নির্ভর করে এটি কার্যকরভাবে কাজ করে না।
ব্যবহৃত_বাই_আলডিয়ার

2
সম্পাদকদের (আবার) দয়া করে, সিউডো কোডের মাধ্যমে উত্সাহী উদ্ধৃতি চিহ্ন যুক্ত করবেন না; তারা উপলব্ধি সাহায্য করে না।
ব্যবহৃত_বাই_আলডিয়ার

18

আপনাকে এই দুটি বিকল্পের একটি করতে হবে:

  1. আপনার betweenঅবস্থার সাথে সময়ের উপাদানটি অন্তর্ভুক্ত করুন : ... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'(প্রস্তাবিত নয় ... শেষ অনুচ্ছেদটি দেখুন)
  2. পরিবর্তে বৈষম্য ব্যবহার করুন between। লক্ষ্য করুন যে তারপরে আপনাকে দ্বিতীয় দিনটিতে একটি দিন যুক্ত করতে হবে:... where (created_at >= '2013-05-01' and created_at < '2013-05-02')

আমার ব্যক্তিগত পছন্দ দ্বিতীয় বিকল্প। এছাড়াও, হারুন বারট্রান্ড হয়েছে কেন একটি খুব স্পষ্ট ব্যাখ্যা এটা ব্যবহার করা উচিত।


6
+1 এর জন্য ২. তবে -1-এর জন্য 1. দিনের হ্যাকের এই শেষটি সম্পূর্ণ অবিশ্বাস্য এবং একটি খারাপ ধারণা।
অ্যারন বারট্রান্ড 21

1
অ্যারোনবার্ট্র্যান্ড আমিও বিকল্প 2 পছন্দ করি (আমি প্রায়শই এটি ব্যবহার করি)। তবে আপনি কেন বলেন বিকল্প 1 "সম্পূর্ণ অবিশ্বস্ত"?
ব্যারঙ্কা 21

5
দয়া করে এটি পুরোপুরি পড়ুনBETWEENসময় সহ অন্তর্ভুক্ত তারিখের সীমা অনুসন্ধানের জন্য আপনার কখনই ব্যবহার করা উচিত নয় ; উপায় খুব বেশি ভুল হতে পারে।
অ্যারন বার্ট্র্যান্ড 21


7

আমি দেখতে পেয়েছি যে একটি তারিখের ক্ষেত্রের সাথে তারিখের ক্ষেত্রের সাথে তুলনা করার সর্বোত্তম সমাধানটি হ'ল:

DECLARE @StartDate DATE = '5/1/2013', 
        @EndDate   DATE = '5/1/2013' 

SELECT * 
FROM   cases 
WHERE  Datediff(day, created_at, @StartDate) <= 0 
       AND Datediff(day, created_at, @EndDate) >= 0 

এটি স্টেটমেন্টের মধ্যে অন্তর্ভুক্তির সমতুল্য কারণ এতে শুরু এবং শেষের তারিখ এবং পাশাপাশি যেগুলি পড়ে থাকে উভয়ই অন্তর্ভুক্ত।


3
cast(created_at as date)

এটি কেবলমাত্র 2008 এবং এসকিউএল সার্ভারের নতুন সংস্করণে কাজ করবে

আপনি যদি পুরানো সংস্করণ ব্যবহার করেন তবে ব্যবহার করুন

convert(varchar, created_at, 101)

2
convert(varchar, created_at, 101)ফলাফলটি এর মত dd/MM/yyyyএবং ওপি'র স্ট্রিংগুলি yyyy-MM-ddআমার মনে হয় এই উত্তরটি কার্যকর হবে না)))
shA.t

2

আপনি সেই date()ফাংশনটি ব্যবহার করতে পারেন যা তারিখের সময় থেকে তারিখটি বের করে এবং সমেত তারিখ হিসাবে আপনাকে ফলাফল দেবে:

SELECT * FROM Cases WHERE date(created_at)='2013-05-01' AND '2013-05-01'

0

দামিক তারিখ বেতার বর্গ কোয়েরি

var startDate = '2019-08-22';
var Enddate = '2019-10-22'
     let sql = "SELECT * FROM Cases WHERE created_at BETWEEN '?' AND '?'";
     const users = await mysql.query( sql, [startDate, Enddate]);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.