2016-12-09 5 views
0

日付の間の年月日を示すこの関数があります。ビューテーブルでは、開始日と終了日のデータがあります。その機能をビューテーブルにどのように統合することが可能ですか?ビューテーブル内のSQL関数

USE [DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter FUNCTION [db].[GetDateDifference] 
(
    @FromDate DATETIME, @ToDate DATETIME 
) 
RETURNS 
@DateDifference TABLE (
YEAR INT, MONTH INT, DAYS INT) 
AS 
BEGIN 
    DECLARE @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME 
    SET @Years = DATEDIFF(YEAR, @FromDate, @ToDate) 
    - (CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FromDate, @ToDate), 
       @FromDate) > @ToDate THEN 1 ELSE 0 END) 

    SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate) 
    SET @Months = DATEDIFF(MONTH, @tmpFromDate, @ToDate) 
    - (CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH, @tmpFromDate, @ToDate), 
       @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

    SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate) 
    SET @Days = DATEDIFF(DAY, @tmpFromDate, @ToDate) 
    - (CASE WHEN DATEADD(DAY, DATEDIFF(DAY, @tmpFromDate, @ToDate), 
       @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

    INSERT INTO @DateDifference 
    VALUES(@Years, @Months, @Days) 

    RETURN 
END 

、ここで私の見解テーブルです:

USE [DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter VIEW [db].[View_ServiceTickets] 

AS 

SELECT TOP 99 

     ServiceTicketDate, 
     BillingDate as 'Project Finished', 
     InspectionScheduleDate 


FROM  tblServiceTicket INNER JOIN 
      tblServiceTicketReport on tblServiceTicket.ServiceTicketID = tblServiceTicketReport.ServiceTicketID 


where ServiceTicketDate > '2016' 
order by ServiceTicketDate desc 

GO 

はそんなに

+0

このデータベースを使用していると思われるSQL Serverタグを追加しました。 –

+0

ご存知のように、これはクライアント側でも達成できます。計算値の目的は何ですか? –

+0

@Ivan Starostin私はこれをExcelレポートに必要とします。 –

答えて

0

をありがとう、私はあなたの関数の戻り値のデータ型がテーブルなので、あなたはそれを表として扱う使用しました。 次のコードをテストすることができます。

alter VIEW [db].[View_ServiceTickets] 

AS 

SELECT TOP 99 

    ServiceTicketDate, 
    BillingDate as 'Project Finished', 
    InspectionScheduleDate, 
    d.* 


FROM  tblServiceTicket INNER JOIN 
     tblServiceTicketReport on tblServiceTicket.ServiceTicketID = tblServiceTicketReport.ServiceTicketID 
     OUTER APPLY(SELECT YEAR,MONTH,DAYS FROM [db].[GetDateDifference](ServiceTicketDate,BillingDate)) d 


where ServiceTicketDate > '2016' 
order by ServiceTicketDate desc 
+0

これらの日付の-7年、6か月、23日の取得IM:2010-06-21および2016-11-28私はServiceTicketDateとBillingDateの所有権を変更し、現在は6y、5m、7dです。しかし、それを1つの列に戻す方法は?私はこの例を持っているhttp://sqlhints.com/2015/07/10/how-to-get-difference-between-two-dates-in-years-months-and-days-in-sql-server/しかしあなたのコードが機能しないスカラー関数を使用します。 –

+0

@Fresher Excelで正確に何を表示する必要がありますか? '2010-06-21と2016-11-28'の正しい結果は何ですか?特にExcelレポート用。 –

+0

@Ivan Starostin正しい結果は、Nolan Shangのスクリプトから6y、5m、7dです。しかし、3つの異なる列のhttp://sqlhints.com/wp-content/uploads/2015/07/Difference-between-dates-in-years-months-and-days-in-sql.jpg。私はここのように一つのコラムに入れておく必要があります:http://sqlhints.com/wp-content/uploads/2015/07/Difference-between-dates-in-years-months-and-days-by-scalar-function -in-sql.jpg(日付の違い) –