Làm cách nào để viết hàm YearFrac đi kèm với Excel trong Sql 2005?YearFrac trong Sql 2005
5
A
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
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
- 1. Isoweek trong SQL Server 2005
- 2. SQL Server 2005 Replication
- 3. Số Ba Tư trong SQL Server 2005
- 4. CHECKSUM() va chạm trong SQL Server 2005
- 5. Hàng khóa trong SQL 2005-2008
- 6. Nhận ngày trong tuần trong SQL 2005/2008
- 7. Phân trang SQL Server 2005 Kết quả
- 8. SQL 2005 SMO - tìm tham khảo bảng
- 9. SQL Server 2005: Nullable Foreign Key Constraint
- 10. Vấn đề chặn SQL Server 2005 (ASYNC_NETWORK_IO)
- 11. Chính xác SQL Server 2005 là gì?
- 12. Hạ cấp máy chủ SQL 2008 sang SQL Server 2005
- 13. SQL server 2005 mất chính xác số
- 14. SQL Express 2005/2008 Connections đồng thời
- 15. Đếm (*) so với Đếm (Id) trong máy chủ sql 2005
- 16. Lưu trữ XSLT trong SQL Server 2005 với loại xml?
- 17. Truy vấn phân cấp trong SQL Server 2005
- 18. Thay đổi ký hiệu tiền tệ trong SQL Reporting 2005
- 19. Kích thước của trường VARBINARY trong SQL Server 2005
- 20. Nhiều lệnh trên cùng một dòng trong SQL Server 2005
- 21. tham gia ba bảng trong sql server 2005
- 22. Tắt lời nhắc "lưu" trong SQL Server Management Studio 2005
- 23. Đổi tên một cột trong MS SQL Server 2005
- 24. Bỏ qua hàng đầu tiên trong SQL Server 2005?
- 25. Char (9) không in tab trong SQL Server 2005
- 26. Cách ánh xạ uint trong NHibernate với SQL Server 2005
- 27. Lỗi LNK 2005 trong Visual Studio 2005
- 28. SQL Server 2005/2008: Chèn tệp vào cột varbinary (max) trong Transact-SQL
- 29. Truy vấn SQL để thêm cột mới sau cột hiện có trong SQL Server 2005
- 30. Thời gian truy cậpZoneInfo từ SQL 2005 Server
Đó không tương ứng với hành vi mặc định của hàm hàm YEARFRAC. .. – Guffa
@ Guffa - cuộc gọi tốt, đã không nhận thấy sự khác biệt. –
đú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. –