2008-08-27 22 views

Trả lời

145

Sau đây thêm -1 năm đến ngày hiện tại:

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

Yours là sạch nhưng đây là những gì tôi có: NĂM (GETDATE()) - 1 – PCPGMR

+0

Điều đó trả về cho bạn một số, không phải ngày, sau đó bạn không thể so sánh số đó với một ngày, mà không tính năm của ngày đó. Điều này sau đó sẽ trả lại kết quả không chính xác cho ngày 31 tháng 12 năm 2014 so với ngày 1 tháng 1 năm 2015 - trong các năm khác nhau, nhưng không phải là một năm ngoài ... – samjudson

+0

chính xác. Tôi cần phải so sánh số năm theo năm, vì vậy từ năm 2013 đến năm 2014 chẳng hạn như dữ liệu đến chỉ có một năm. Tôi không rõ ràng trong bình luận của tôi. Cảm ơn bạn – PCPGMR

1

Tra cứu dateadd trong BOL

dateadd(yy,-1,getdate()) 
1

GETDATE() trả về ngày hiện tại và thời gian .

Nếu năm ngoái bắt đầu trong nửa đêm của ngày hiện tại vào năm ngoái (như trong ví dụ ban đầu), bạn nên sử dụng một cái gì đó như:

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 
2

Vâng, tôi nghĩ rằng một cái gì đó là mất tích ở đây. Người dùng muốn nhận dữ liệu từ năm ngoái và không phải từ 365 ngày qua. Có một sự khác biệt rất lớn. Theo quan điểm của tôi, dữ liệu từ năm ngoái là mọi dữ liệu từ năm 2007 (nếu tôi vào năm 2008). Vì vậy, câu trả lời đúng sẽ là:

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

Sau đó, nếu bạn muốn hạn chế truy vấn này, bạn có thể thêm một số bộ lọc khác, nhưng luôn luôn tìm kiếm trong năm ngoái

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

Điều này sẽ có hiệu suất rất xấu trên các bảng lớn, truy vấn của bạn sẽ lặp lại trên mỗi bản ghi để đánh giá giá trị năm của ngày, tốt hơn nên sử dụng phạm vi ngày –

2

Các dễ đọc nhất, IMO :

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

nào:

  1. Nhận giờ hiện tại GETDATE() = # 8/27/2008 10:23 am#
  2. Chuyển đổi thành chuỗi có định dạng 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = ' 2007/08/27'
  3. Chuyển đổi sang một datetime CONVERT (datetime, '2007/08/27') = # 8/27/2008 12:00 AM#
  4. trừ 1 năm DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

Có các biến thể với DATEDIFF và DATEADD để giúp bạn có được nửa đêm ngày hôm nay, nhưng chúng có xu hướng khá ngượng ngùng (mặc dù tốt hơn một chút về hiệu suất - không phải là bạn sẽ nhận thấy so với số lần đọc cần thiết để tìm nạp dữ liệu).

0

Các đề xuất khác là tốt nếu bạn có "chỉ SQL".

Tuy nhiên tôi đề nghị, rằng - nếu có thể - bạn tính ngày tháng trong chương trình của bạn và chèn nó làm chuỗi trong truy vấn SQL.

Ít nhất là dành cho các bảng lớn (nghĩa là hàng triệu hàng, có thể kết hợp với kết nối) sẽ giúp bạn cải thiện tốc độ đáng kể khi trình tối ưu hóa có thể hoạt động tốt hơn nhiều.

+2

Sẽ tốt hơn nếu bạn tạo chuỗi được tham số hóa và tránh đặt giá trị vào chính chuỗi đó ... –

0

luận cho chức năng DATEADD:

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

datepart có thể là: yy, qq, mm, dy, đ, tuần, dw, hh, mi, ss, ms

số là một biểu thức có thể được giải quyết thành một int được thêm vào một ngày tháng của ngày

ngày là một biểu thức có thể được giải quyết theo ngày, giờ, smalldatetime, datetime, datetime2 hoặc giá trị 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

Điều này không giải quyết được câu hỏi. –

+0

Ngoài ra, trong khi vòng lặp nói chung là xấu cho SQL – StingyJack

8

Tôi tìm thấy trang này trong khi tìm kiếm giải pháp có thể giúp tôi chọn kết quả từ năm dương lịch trước. Hầu hết các kết quả được hiển thị ở trên dường như trả lại các mục từ 365 ngày qua, điều này không có tác dụng đối với tôi.

Đồng thời, nó đã cho tôi đủ hướng để giải quyết nhu cầu của tôi trong đoạn mã sau - tôi đăng bài ở đây cho bất kỳ người nào khác có nhu cầu tương tự như tôi và ai có thể gặp trang này một giải pháp.

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

Nhờ những giải pháp trên giúp tôi đạt được những gì tôi cần.

-2

ĐÂU ngày> DATE_SUB (NOW(), INTERVAL 1 NĂM)

này sẽ cung cấp cho bạn một truy vấn mà sẽ kéo 1 năm của dữ liệu bất cứ khi nào bạn chạy nó.

+1

Câu hỏi đặt ra là cho Microsoft SQL Server không sử dụng hàm 'date_sub' cũng như cấu trúc' interval'. – jpw

0

Tôi, như @ D.E. Trắng, đến đây vì những lý do tương tự nhưng khác với câu hỏi ban đầu. Câu hỏi ban đầu yêu cầu 365 ngày qua. @ samjudson của câu trả lời cung cấp đó. @ D.E. Câu trả lời của White trả về kết quả cho năm dương lịch trước.

truy vấn của tôi là một chút khác nhau ở chỗ nó làm việc cho năm trước lên đến và bao gồm ngày hiện tại:

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

Ví dụ, trên 17 tháng hai năm 2017 truy vấn này trả về kết quả từ 1/1/2016 đến 2/17/2017

0

Tôi gặp sự cố tương tự nhưng bộ mã trước đó chỉ cung cấp ngày theo định dạng mm-yyyy. Giải pháp của tôi rất đơn giản nhưng có thể chứng minh hữu ích cho một số (Tôi cũng muốn để chắc chắn đầu và không gian kết thúc đã bị loại):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'- 
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE()) 
Các vấn đề liên quan