এসকিউএল সার্ভার: কেবল গত বছরের জন্য ডেটা পান


102

আমি একটি ক্যোয়ারী লিখছি যেখানে আমাকে কেবল গত বছরের জন্য ডেটা পেতে হবে। এই কাজ করতে সবচেয়ে ভালো উপায় কি?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

উত্তর:


201

নিম্নলিখিতটি বর্তমান তারিখে -1 বছর যোগ করে:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

4
আপনারা ক্লিনার তবে এখানে যা ছিল তা এখানে: YEAR (GETDATE ()) - 1
PCPGMR

4
এটি আপনাকে একটি নম্বর দেয়, তারিখ নয়, আপনি তারপরের তারিখটির সাথে বছরের তুলনা না করে, কোনও তারিখের সাথে তুলনা করতে পারবেন না। এরপরে 31 ডিসেম্বর 2014 বনাম 1 জানুয়ারী 2015 - এর জন্য ভুল ফলাফল ফিরে আসবে - যা বিভিন্ন বছরে, তবে এক বছর বাদে নয় ...
সামজডসন

সঠিক আমার বছরের তুলনায় বছরের তুলনা করা দরকার, সুতরাং ২০১৩ সাল থেকে ২০১৪ উদাহরণস্বরূপ যেমন ডেটা আসছে কেবল বছরের মধ্যে। আমি আমার মন্তব্যে পরিষ্কার ছিল না। আপনাকে ধন্যবাদ
পিসিপিজিএমআর

এই কোয়েরিটি চালাওয়ার সময় আমি একটি ত্রুটি বার্তা পেয়েছি ... "ফাংশন ডেটাবেসনেম।
মার্সেলো পেরি

10

কোনও পূর্ববর্তী ক্যালেন্ডার বছর থেকে ফলাফল নির্বাচন করতে আমাকে সহায়তা করতে পারে এমন কোনও সমাধান খুঁজতে গিয়ে আমি এই পৃষ্ঠাটি পেয়েছি। উপরে প্রদর্শিত বেশিরভাগ ফলাফলগুলি গত 365 দিনের রিটার্ন আইটেমগুলি বলে মনে হচ্ছে, যা আমার পক্ষে কার্যকর হয়নি।

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

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

যাদের উপরের সমাধানগুলি আমার প্রয়োজনীয় জিনিসগুলি পৌঁছাতে সহায়তা করেছে তাদের উপরে ধন্যবাদ জানাই।


7

ঠিক আছে, আমি মনে করি এখানে কিছু অনুপস্থিত। ব্যবহারকারী গত 365 দিন থেকে নয়, গত বছর থেকে ডেটা পেতে চায়। একটি বিশাল দ্বিধা আছে। আমার মতে, গত বছর থেকে প্রাপ্ত তথ্য 2007 এর প্রতিটি ডেটা (যদি আমি এখন ২০০৮ এ থাকি)। সুতরাং সঠিক উত্তর হবে:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

তারপরে আপনি যদি এই ক্যোয়ারিকে সীমাবদ্ধ রাখতে চান তবে আপনি কিছু অন্যান্য ফিল্টার যুক্ত করতে পারেন তবে সর্বদা সর্বশেষ বছরের অনুসন্ধানে।

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

এটি বড় টেবিলগুলিতে খুব খারাপ পারফরম্যান্স করবে, আপনি কোয়েরি তারিখের বছরের মূল্য মূল্যায়ন করতে প্রতিটি রেকর্ড ছাড়িয়ে যাবেন, একটি তারিখের সীমা ব্যবহার করা আরও ভাল হবে
অ্যাড্রিয়ান দাভেল


4

সর্বাধিক পঠনযোগ্য, আইএমও:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

যা:

  1. এখন DATETIME এর পায় GETDATE () = # 8/27/2008 10:23 am#
  2. 101 CONVERT (বর্ণচর, # 8/27/2008 10:23 এএম, 101) = '8/27/2007' বিন্যাসের সাথে একটি স্ট্রিংয়ে রূপান্তর করে
  3. একটি ডেটটাইম কনভার্টে রূপান্তরিত হয় (তারিখের সময়, '8/27/2007') = # 8/27/2008 12:00 এএম#
  4. 1 বছর তারিখের বিয়োগ (yy, -1, # 8/27/2008 12:00 এএম#) = # 8/27/2007 12:00 এএম#

আপনাকে আজকের মধ্যরাত পেতে DATEDIFF এবং DATEADD এর সাথে বৈকল্পিক রয়েছে, তবে তারা বরং অভ্যাসের দিকে ঝুঁকছে (পারফরম্যান্সে কিছুটা ভাল - যদিও আপনি তথ্য আনতে প্রয়োজনীয় পাঠকদের তুলনায় লক্ষ্য করবেন না)।


2

GETDATE()বর্তমান তারিখ এবং সময় প্রদান করে

গত বছর যদি চলতি দিনের মধ্যরাতে গত বছরের শুরু হয় (মূল উদাহরণের মতো) আপনার এমন কিছু ব্যবহার করা উচিত:

DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) --  getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start

0

অন্যান্য পরামর্শগুলি আপনার কাছে "কেবলমাত্র এসকিউএল" থাকলে ভাল।

তবে আমি প্রস্তাব দিই, এটি - যদি সম্ভব হয় - আপনি আপনার প্রোগ্রামের তারিখটি গণনা করুন এবং এসকিউএল কোয়েরিতে স্ট্রিং হিসাবে এটি .োকান।

কমপক্ষে বড় টেবিলের জন্য (অর্থাত্ কয়েক মিলিয়ন সারি, সম্ভবত এতে যোগ দেয়) যা আপনাকে যথেষ্ট গতির উন্নতি দেয় কারণ অপটিমাইজার আরও ভালর সাথে কাজ করতে পারে।


4
যদি আপনি একটি প্যারামিটারাইজড স্ট্রিং তৈরি করেন এবং স্ট্রিংয়ের মধ্যে মান স্থাপন না করা ভাল তবেই ভাল হবে ...
অ্যাড্রিয়ান দাভেল

0

DATEADD ফাংশনের পক্ষে যুক্তি:

DATEADD (*datepart* , *number* , *date* )

ডেট পার্টটি হতে পারে: yy, qq , mm, dy, dd, wk, dw, hh, mi, ss, ms

সংখ্যা এমন একটি অভিব্যক্তি যা কোনও ডেট পার্টের সাথে তারিখের অংশে যুক্ত হওয়া কোনও সমাধান করা যায়

তারিখটি এমন একটি অভিব্যক্তি যা কোনও সময়, তারিখ, ছোট তারিখ, তারিখ সময়, তারিখটাইম 2, বা ডেটটাইমসেট মানকে সমাধান করা যায়।


0
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
    set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
    set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
    select @sYear + @sMonth
    set @iMonth = @iMonth - 1
end

4
এটি প্রশ্নের সমাধান করে না।
নাথান Skerl

এছাড়াও, যখন লুপগুলি সাধারণত এসকিউএল
স্টিংজি জ্যাক

0

আমি, @ ডিআই হোয়াইটের মতো, মূল প্রশ্নের তুলনায় একই রকম তবে ভিন্ন কারণে এখানে এসেছি। আসল প্রশ্নটি সর্বশেষ ৩5৫ দিনের জন্য জিজ্ঞাসা করে। @ সামজডসনের উত্তর এটি সরবরাহ করে। @ ডি হোয়াইট এর উত্তর পূর্ববর্তী ক্যালেন্ডার বছরের ফলাফল দেয়।

আমার জিজ্ঞাসাটি কিছুটা আলাদা যে এটি এর জন্য কাজ করে পূর্ববর্তী বছরের জন্য বর্তমান তারিখ পর্যন্ত কাজ করে:

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

উদাহরণস্বরূপ, ফেব্রুয়ারী 17, 2017 এ এই ক্যোয়ারী 1/1/2016 থেকে ২/১/201/২০১ results তারিখের ফলাফল দেয়


0

আমার একইরকম সমস্যা ছিল তবে পূর্ববর্তী কোডারটি কেবলমাত্র মিমি-ইয়ে ফর্মেটে তারিখটি দিয়েছিল। আমার সমাধানটি সহজ তবে এটি কারওর পক্ষে সহায়ক প্রমাণিত হতে পারে (আমি নিশ্চিত হতে চেয়েছিলাম যে শুরু এবং শেষের স্থানগুলি অপসারণ করা হয়েছিল):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

0

কিছু কারণে উপরের ফলাফলগুলির মধ্যে কোনওটিই আমার পক্ষে কার্যকর হয়নি।

এটি গত ৩ 36৫ দিন নির্বাচন করে।

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

আপনি এমএসএসকিউএল সার্ভারের সংস্করণটি যুক্ত করতে পারেন যার জন্য এটি কাজ করে good
itwasntme
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.