2009-07-10 19 views

Trả lời

5

Tìm hiểu khoảng cách giữa hai ngày sử dụng DateDiff, và sau đó chia cho giá trị bằng 365

EDIT

Bạn có thể, tất nhiên, tạo chức năng của riêng bạn để thực hiện công việc:

create function yearfrac (@d1 datetime, @d2 datetime) returns float 
as 
begin 
return abs(datediff(d, @d1, @d2))/365.00 
end 
+2

Đó không tương ứng với hành vi mặc định của hàm hàm YEARFRAC. .. – Guffa

+0

@ Guffa - cuộc gọi tốt, đã không nhận thấy sự khác biệt. –

+0

đúng, guffa, tôi đã bỏ lỡ cái đó. trong phiên bản của bạn, mặc dù, bạn phải làm một cái gì đó như giải pháp * 365.00 * của tôi ở trên, để buộc bộ phận làm việc với số thập phân, nếu không bạn sẽ luôn kết thúc với 0. –

3

Để sử dụng mặc định (hai tham số dữ liệu):

datediff(day, date1, date2)/360.0 

Đối với trường hợp đặc biệt, nếu tham số thứ ba có giá trị 3:

datediff(day, date1, date2)/365.0 

Edit:
gia tăng một số thập phân để làm cho nó hoạt động một dấu chấm động.

+0

fyi, điều này cắt bớt giá trị trả về. –

-3

Tôi biết đây là một chút trễ của một phản ứng nhưng chỉ trong trường hợp tình cờ bất cứ ai khác trên này đây là những gì tôi đã thực hiện:

CREATE FUNCTION dbo.udfYearFrac 
(
    @StartDate AS DATETIME, 
    @EndDate AS DATETIME 
) 
RETURNS DECIMAL(18,6) 
AS 
BEGIN 
    DECLARE @YearFrac  AS DECIMAL(18,6) 
    DECLARE @nbDaysInPeriod AS INT 
    DECLARE @nbYears  AS INT 

    SELECT 
     @nbDaysInPeriod = DATEDIFF(DAY, @StartDate, @EndDate) 
     ,@nbYears = YEAR(@EndDate) - YEAR(@StartDate) + 1 

    SELECT @YearFrac = @nbDaysInPeriod/
     CASE WHEN YEAR(@StartDate) = YEAR(@EndDate) OR (YEAR(@EndDate)-1 = YEAR(@StartDate) AND (MONTH(@StartDate) > MONTH(@EndDate) OR MONTH(@StartDate) = MONTH(@EndDate) AND (DAY(@StartDate) >= DAY(@EndDate)))) 
     THEN 
      CASE WHEN YEAR(@StartDate) = YEAR(@EndDate) AND ISDATE(CAST(YEAR(@StartDate) AS CHAR(4)) + '0229') = 1 
      THEN 366.0 
      ELSE 
       CASE WHEN DAY(@EndDate) = 29 AND MONTH(@EndDate) = 2 
       THEN 366.0 
       ELSE 
        CASE WHEN ISDATE(CAST(YEAR(@StartDate) AS CHAR(4)) + '0229') = 1 
        THEN 
         CASE WHEN (@StartDate <= cast('2/29/' + cast(YEAR(@StartDate) AS CHAR(4)) AS DATETIME) AND cast('2/29/' + cast(YEAR(@StartDate) AS CHAR(4)) AS DATETIME) <= @EndDate) 
         THEN 366.0 
         ELSE 365.0 
         END 
        ELSE 
         CASE WHEN ISDATE(CAST(YEAR(@EndDate) AS CHAR(4)) + '0229') = 1 
         THEN 
          CASE WHEN (@StartDate <= cast('2/29/' + cast(YEAR(@EndDate) AS CHAR(4)) AS DATETIME) AND cast('2/29/' + cast(YEAR(@EndDate) AS CHAR(4)) AS DATETIME) <= @EndDate) 
          THEN 366.0 
          ELSE 365.0 
          END 
         ELSE 365.0 
         END 
        END 
       END 
      END 
     ELSE 
      ((@nbYears * 365.0) + 
       (
        SELECT COUNT(*) FROM 
        (
         SELECT (ROW_NUMBER() OVER(ORDER BY TABLE_NAME ASC) - 1) * 4 + 1900 AS [YEAR] 
         FROM INFORMATION_SCHEMA.COLUMNS 
        ) yr 
        WHERE [YEAR] BETWEEN YEAR(@StartDate) AND YEAR(@EndDate) 
       ) 
      )/@nbYears 
     END 
    RETURN @YearFrac 
END 
Các vấn đề liên quan