2016-12-09 3 views
0

У меня есть эта функция, которая показывает годы, месяцы и дни между датами. В таблице просмотра у меня есть данные с датами начала и окончания. Как можно интегрировать эту функцию в мою таблицу представлений?SQL function in view table

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

@ Иван Старостин Мне нужно это для отчета 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

im получение -7 лет, 6 месяцев, 23 дня с этими датами: 2010-06-21 и 2016-11-28. Я изменил возможность ServiceTicketDate и BillingDate, и теперь он отлично, 6y, 5m, 7d. Но как вернуть его в один столбец? У меня есть этот пример 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

@ Иван Старостин правильный результат - 6y, 5m, 7d, что отлично от скрипта Nolan Shang. Но это в трех разных столбцах: 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 (Разница между датами) –