SQL Server: รับข้อมูลเฉพาะปีที่ผ่านมา


102

ฉันกำลังเขียนข้อความค้นหาซึ่งฉันต้องได้รับข้อมูลสำหรับปีที่แล้วเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?

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

คำตอบ:


201

ต่อไปนี้จะเพิ่ม -1 ปีในวันที่ปัจจุบัน:

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

1
ของคุณสะอาดกว่า แต่นี่คือสิ่งที่ฉันมี: YEAR (GETDATE ()) - 1
PCPGMR

2
นั่นจะส่งคืนตัวเลขให้คุณไม่ใช่วันที่คุณจึงไม่สามารถเปรียบเทียบกับวันที่นั้นได้โดยไม่ต้องคำนวณปีของวันนั้นด้วย จากนั้นจะให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับวันที่ 31 ธันวาคม 2557 เทียบกับ 1 มกราคม 2558 ซึ่งอยู่คนละปีกัน แต่ไม่ห่างกัน 1 ปี ...
samjudson

แก้ไข. ฉันต้องการเปรียบเทียบปีต่อปีดังนั้น 2013 ถึง 2014 เช่นข้อมูลที่เข้ามามีเพียงปีเดียว ฉันไม่ชัดเจนในความคิดเห็นของฉัน ขอบคุณ
PCPGMR

ฉันได้รับข้อความแสดงข้อผิดพลาดในการเรียกใช้แบบสอบถามนี้ ... "ไม่มี FUNCTION DatabaseName.DATEADD" มีข้อเสนอแนะหรือไม่
Marcello Perri

10

ฉันพบหน้านี้ในขณะที่กำลังมองหาวิธีแก้ปัญหาที่จะช่วยฉันเลือกผลลัพธ์จากปีปฏิทินก่อนหน้า ผลลัพธ์ส่วนใหญ่ที่แสดงด้านบนดูเหมือนว่าจะส่งคืนสินค้าจาก 365 วันที่ผ่านมาซึ่งไม่ได้ผลสำหรับฉัน

ในขณะเดียวกันก็ให้แนวทางเพียงพอที่จะแก้ปัญหาความต้องการของฉันในรหัสต่อไปนี้ซึ่งฉันโพสต์ไว้ที่นี่สำหรับคนอื่น ๆ ที่มีความต้องการเช่นเดียวกับฉันและผู้ที่อาจเจอหน้านี้ในการค้นหาวิธีแก้ปัญหา

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

ขอบคุณคนข้างต้นที่มีวิธีแก้ปัญหาช่วยให้ฉันได้มาถึงสิ่งที่ฉันต้องการ


7

ฉันคิดว่ามีบางอย่างหายไปที่นี่ ผู้ใช้ต้องการรับข้อมูลจากปีที่แล้วไม่ใช่จาก 365 วันที่ผ่านมา มีความแตกต่างกันมาก ในความคิดของฉันข้อมูลจากปีที่แล้วคือทุกข้อมูลจากปี 2550 (ถ้าฉันอยู่ในปี 2551 ตอนนี้) ดังนั้นคำตอบที่ถูกต้องคือ:

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

จากนั้นหากคุณต้องการ จำกัด คำค้นหานี้คุณสามารถเพิ่มตัวกรองอื่น ๆ ได้ แต่จะค้นหาในปีที่แล้วเสมอ

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

สิ่งนี้จะมีประสิทธิภาพที่แย่มากในตารางขนาดใหญ่คุณจะค้นหาทุกระเบียนเพื่อประเมินค่าปีของวันที่ควรใช้ช่วงวันที่ดีกว่า
Adriaan Davel


4

IMO ที่อ่านง่ายที่สุด:

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

ที่:

  1. รับวันที่และเวลาของตอนนี้ GETDATE () = # 8/27/2008 10:23 am#
  2. แปลงเป็นสตริงด้วยรูปแบบ 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. แปลงเป็นวันที่และเวลา CONVERT (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. ลบ 1 ปีDATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 00:00 AM#

มีตัวแปรที่มี 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

คำแนะนำอื่น ๆ นั้นดีถ้าคุณมี "SQL เท่านั้น"

อย่างไรก็ตามฉันขอแนะนำว่าถ้าเป็นไปได้ให้คุณคำนวณวันที่ในโปรแกรมของคุณและแทรกเป็นสตริงในแบบสอบถาม SQL

อย่างน้อยสำหรับตารางขนาดใหญ่ (เช่นหลายล้านแถวอาจรวมกับการรวม) ซึ่งจะทำให้คุณได้รับการปรับปรุงความเร็วอย่างมากเนื่องจากเครื่องมือเพิ่มประสิทธิภาพสามารถทำงานได้ดีขึ้นมาก


2
จะดีกว่าถ้าคุณสร้างสตริงที่กำหนดพารามิเตอร์และหลีกเลี่ยงการวางค่าในสตริงเอง ...
Adriaan Davel

0

อาร์กิวเมนต์สำหรับฟังก์ชัน DATEADD:

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

datepartสามารถเป็น: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms

จำนวนคือนิพจน์ที่สามารถแก้ไขเป็น int ที่เพิ่มเข้ากับ datepart of date

dateคือนิพจน์ที่สามารถแก้ไขเป็นค่าเวลาวันที่เวลาวันที่เวลาวันที่เวลา datetime2 หรือ datetimeoffset


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

1
สิ่งนี้ไม่ได้ตอบคำถาม
Nathan Skerl

นอกจากนี้ในขณะที่ลูปมักไม่ดีสำหรับ SQL
StingyJack

0

ฉันชอบ @DE White มาที่นี่ด้วยเหตุผลที่คล้ายกัน แต่แตกต่างจากคำถามเดิม คำถามเดิมจะถามถึง 365 วันที่ผ่านมา คำตอบของ @ samjudson ให้สิ่งนั้น คำตอบของ @DE White ส่งกลับผลลัพธ์สำหรับปีปฏิทินก่อนหน้า

ข้อความค้นหาของฉันแตกต่างกันเล็กน้อยเนื่องจากใช้ได้กับปีก่อนหน้าจนถึงวันที่ปัจจุบัน:

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

ตัวอย่างเช่นในวันที่ 17 กุมภาพันธ์ 2017 คำค้นหานี้จะแสดงผลลัพธ์จาก 1/1/2016 ถึง 17/02/2017


0

ฉันมีปัญหาที่คล้ายกัน แต่ coder ก่อนหน้านี้ระบุวันที่ในรูปแบบ mm-yyyy เท่านั้น วิธีแก้ปัญหาของฉันง่าย แต่อาจเป็นประโยชน์กับบางคน (ฉันอยากให้แน่ใจว่าช่องว่างเริ่มต้นและสิ้นสุดถูกกำจัดออกไป):

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

0

ด้วยเหตุผลบางประการผลลัพธ์ข้างต้นไม่ได้ผลสำหรับฉัน

เลือก 365 วันที่ผ่านมา

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

จะเป็นการดีถ้าคุณสามารถเพิ่มเซิร์ฟเวอร์ MSSQL เวอร์ชันที่ใช้งานได้
itwasntme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.