2016-12-14 10 views
0

関数を使用せずに、2つの日付の間に月、日の差が生じる問題があります。日付間のSQLの差異(年、月、日)

これまでのところ、私はこの乱雑なコードを持っていますが、うまく動作しません。時には月/日が - です。 tblProject.BillingDateはStartDate、tblServiceTicket.ServiceTicketDateはEndDateです。

  CONVERT(varchar(12),datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate)) + ' year, ' 
     + CONVERT(varchar(12),DATEDIFF(MM, DATEADD(YY, datediff(YEAR,tblServiceTicket.ServiceTicketDate,tblProject.BillingDate), tblServiceTicket.ServiceTicketDate), tblProject.BillingDate)) + ' months, ' 
     + CONVERT(varchar(12),DATEDIFF(DD, DATEADD(MM, DATEDIFF(MM, DATEADD(YY, (datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate)), tblProject.BillingDate), tblServiceTicket.ServiceTicketDate), DATEADD(YEAR, datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate) , tblProject.BillingDate)), tblServiceTicket.ServiceTicketDate)) + ' days ' 
+2

DATEDIFFを単独で使用するのはなぜですか? – dfundako

+0

あなたの例では、CONVERT関数を使用しました。 – DVT

+0

Datediffは使用する必要がありますが、あなたが考えている方法で使用する必要はありません。そして、 '@dstart = '20161231'、' @dend = '20170101''のような実際のケースを扱うためのルールを設定しなければならないでしょう。ここで 'DATEDIFF'は1を返します、月、または日。あなたが探しているのは、年、月、日のINTERVAL計算で、日付付きの型関数ではありません。 –

答えて

1

私がこれを行うことを知っている唯一の方法は、このように半反復です。このバージョンは、DATEDIFFを中心にコーディングすることで改善することができますが、DATEDIFFバージョンよりもはっきりと必要なロジックを示しています。

DECLARE @dstart datetime, 
    @dend datetime, 
    @dwork datetime 

DECLARE @yy int, 
    @mm int, 
    @dd int 

SET @dstart = '19570125' 
SET @dend = '20161214' 

DECLARE @ix int 

-- Get Year interval 
SET @ix = 0 
WHILE @ix >= 0 
BEGIN 
    Set @ix = @ix + 1 
    IF Dateadd(year, @ix, @dstart) > @dend 
    BEGIN 
     SET @yy = @ix - 1 
     SET @ix = -1 
    END 
END 

Set @dwork = Dateadd(year, @yy, @dstart) 

-- Get month interval 
SET @ix = 0 
WHILE @ix >= 0 
BEGIN 
    Set @ix = @ix + 1 
    IF Dateadd(MONTH, @ix, @dwork) > @dend 
    BEGIN 
     SET @mm = @ix - 1 
     SET @ix = -1 
    END 
END 

Set @dd = DATEDIFF(day, dateadd(month, @mm, @dwork), @dend) 

SELECT 'The difference is ' + Cast(@yy as varchar) + ' years, ' + Cast(@mm as varchar) + ' Months, and ' + Cast(@dd as varchar) + ' Days' 

ここにいくつかの問題がどのように処理されるかを示すいくつかのサンプル出力があります。

-- One day at new years 
SET @dstart = '20161231' 
SET @dend = '20170101' 

-- The difference is 0 years, 0 Months, and 1 Days 

-- One month to a shorter month 
SET @dstart = '20160131' 
SET @dend = '20170228' 

-- The difference is 1 years, 1 Months, and 0 Days 

-- My age 
SET @dstart = '19570125' 
SET @dend = '20161214' 

-- The difference is 59 years, 10 Months, and 19 Days 
関連する問題