ฉันกำลังเขียนข้อความค้นหาซึ่งฉันต้องได้รับข้อมูลสำหรับปีที่แล้วเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
ฉันกำลังเขียนข้อความค้นหาซึ่งฉันต้องได้รับข้อมูลสำหรับปีที่แล้วเท่านั้น วิธีที่ดีที่สุดในการทำคืออะไร?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
คำตอบ:
ต่อไปนี้จะเพิ่ม -1 ปีในวันที่ปัจจุบัน:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
ฉันพบหน้านี้ในขณะที่กำลังมองหาวิธีแก้ปัญหาที่จะช่วยฉันเลือกผลลัพธ์จากปีปฏิทินก่อนหน้า ผลลัพธ์ส่วนใหญ่ที่แสดงด้านบนดูเหมือนว่าจะส่งคืนสินค้าจาก 365 วันที่ผ่านมาซึ่งไม่ได้ผลสำหรับฉัน
ในขณะเดียวกันก็ให้แนวทางเพียงพอที่จะแก้ปัญหาความต้องการของฉันในรหัสต่อไปนี้ซึ่งฉันโพสต์ไว้ที่นี่สำหรับคนอื่น ๆ ที่มีความต้องการเช่นเดียวกับฉันและผู้ที่อาจเจอหน้านี้ในการค้นหาวิธีแก้ปัญหา
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
ขอบคุณคนข้างต้นที่มีวิธีแก้ปัญหาช่วยให้ฉันได้มาถึงสิ่งที่ฉันต้องการ
ฉันคิดว่ามีบางอย่างหายไปที่นี่ ผู้ใช้ต้องการรับข้อมูลจากปีที่แล้วไม่ใช่จาก 365 วันที่ผ่านมา มีความแตกต่างกันมาก ในความคิดของฉันข้อมูลจากปีที่แล้วคือทุกข้อมูลจากปี 2550 (ถ้าฉันอยู่ในปี 2551 ตอนนี้) ดังนั้นคำตอบที่ถูกต้องคือ:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
จากนั้นหากคุณต้องการ จำกัด คำค้นหานี้คุณสามารถเพิ่มตัวกรองอื่น ๆ ได้ แต่จะค้นหาในปีที่แล้วเสมอ
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
ค้นหาวันที่เพิ่มใน BOL
dateadd(yy,-1,getdate())
IMO ที่อ่านง่ายที่สุด:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
ที่:
มีตัวแปรที่มี DATEDIFF และ DATEADD เพื่อให้คุณได้รับเที่ยงคืนของวันนี้ แต่พวกมันมักจะค่อนข้างป้าน (แม้ว่าประสิทธิภาพจะดีกว่าเล็กน้อย - ไม่ใช่ว่าคุณจะสังเกตเห็นเมื่อเทียบกับการอ่านที่จำเป็นเพื่อดึงข้อมูล)
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
คำแนะนำอื่น ๆ นั้นดีถ้าคุณมี "SQL เท่านั้น"
อย่างไรก็ตามฉันขอแนะนำว่าถ้าเป็นไปได้ให้คุณคำนวณวันที่ในโปรแกรมของคุณและแทรกเป็นสตริงในแบบสอบถาม SQL
อย่างน้อยสำหรับตารางขนาดใหญ่ (เช่นหลายล้านแถวอาจรวมกับการรวม) ซึ่งจะทำให้คุณได้รับการปรับปรุงความเร็วอย่างมากเนื่องจากเครื่องมือเพิ่มประสิทธิภาพสามารถทำงานได้ดีขึ้นมาก
อาร์กิวเมนต์สำหรับฟังก์ชัน DATEADD:
DATEADD (*datepart* , *number* , *date* )
datepartสามารถเป็น: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
จำนวนคือนิพจน์ที่สามารถแก้ไขเป็น int ที่เพิ่มเข้ากับ datepart of date
dateคือนิพจน์ที่สามารถแก้ไขเป็นค่าเวลาวันที่เวลาวันที่เวลาวันที่เวลา datetime2 หรือ datetimeoffset
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
ฉันชอบ @DE White มาที่นี่ด้วยเหตุผลที่คล้ายกัน แต่แตกต่างจากคำถามเดิม คำถามเดิมจะถามถึง 365 วันที่ผ่านมา คำตอบของ @ samjudson ให้สิ่งนั้น คำตอบของ @DE White ส่งกลับผลลัพธ์สำหรับปีปฏิทินก่อนหน้า
ข้อความค้นหาของฉันแตกต่างกันเล็กน้อยเนื่องจากใช้ได้กับปีก่อนหน้าจนถึงวันที่ปัจจุบัน:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
ตัวอย่างเช่นในวันที่ 17 กุมภาพันธ์ 2017 คำค้นหานี้จะแสดงผลลัพธ์จาก 1/1/2016 ถึง 17/02/2017
ฉันมีปัญหาที่คล้ายกัน แต่ coder ก่อนหน้านี้ระบุวันที่ในรูปแบบ mm-yyyy เท่านั้น วิธีแก้ปัญหาของฉันง่าย แต่อาจเป็นประโยชน์กับบางคน (ฉันอยากให้แน่ใจว่าช่องว่างเริ่มต้นและสิ้นสุดถูกกำจัดออกไป):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())
ด้วยเหตุผลบางประการผลลัพธ์ข้างต้นไม่ได้ผลสำหรับฉัน
เลือก 365 วันที่ผ่านมา
SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()