2011-02-02 6 views
0

誰でもSQL Serverの日付の時間差の値を取得する方法を知っていますか?例えばSQL Serverで日付の時差の値を取得する方法

:私は次の列

Name Join_Date    Exp_Date 
Alvin 2010-01-01 12:30:00 2010-01-03 11:30:00 
Amy  2010-01-01 15:30:00 2010-01-02 10:30:00 

でテーブルコールの顧客を持っている場合は

がどのように私は、SQL Serverの次のような結果を得ることができますか?

Name Join_Date    Exp_Date    Diff 
Alvin 2010-01-01 12:30:00 2010-01-03 11:30:00  2days 1hour 
Amy  2010-01-01 15:30:00 2010-01-02 10:30:00  1day 7hours 
+1

差分値をあなたが示したことは、やや混乱しています。時間の部分の差とは別に日付の部分の差を計算することを意味しますか、それらはちょうど任意の数ですか?つまり、2010-01-01 12:30:00と2010-01-03 11:30:00の実際の差は1日23時間です。しかし、あなたは日付差と時間差を互いに独立して計算して表示しているようです。 –

答えて

1
Select Name, Join_Date, Exp_Date 
    , DateDiff(d, Join_Date, Exp_Date) As [Days] 
    , DateDiff(hh, Join_Date, Exp_Date) As [Hours] 

それとも

Select Name, Join_Date, Exp_Date 
    , Cast(DateDiff(d, Join_Date, Exp_Date) As varchar(10)) + ' days ' 
     + Cast(DateDiff(hh, Join_Date, Exp_Date) As varchar(10)) + ' hours' 

またはスーパー派手なバージョン

Select Name, Join_Date, Exp_Date 
    , Cast(DateDiff(d, Join_Date, Exp_Date) As varchar(10)) 
     + Case 
      When DateDiff(d, Join_Date, Exp_Date) = 1 Then ' day ' 
      Else ' days ' 
      End 
     + Cast(DateDiff(hh, Join_Date, Exp_Date) As varchar(10)) 
     + Case 
      When DateDiff(hh, Join_Date, Exp_Date) = 1 Then ' hour' 
      Else ' hours ' 
      End 
0

私のソリューションを使用すると、日付/時刻部分の名前をしたいことを想定してい英語と使用UDF

それはExp_Dateが今日であるとJoin_Dateは昨日だったが、それはそれらの間の24時間未満である場合には、日数が0なり、すなわち、日付時刻間の実際の差を算出します。無記号部分は表示されません。

CREATE FUNCTION dbo.fnGetDTPart (@UnitName varchar(10), @Number int) 
RETURNS varchar(50) 
AS BEGIN 
    DECLARE @Result varchar(50); 
    IF @Number = 0 
    SET @Result = '' 
    ELSE 
    SET @Result = CAST(@Number AS varchar) + @UnitName + 
     CASE @Number WHEN 1 THEN ' ' ELSE 's ' END; 
    RETURN @Result; 
END 
GO 


WITH Customer (Name, Join_Date, Exp_Date) AS (
    SELECT 
    'Alvin', 
    CAST('2010-01-01 12:30:00' AS datetime), 
    CAST('2010-01-03 11:30:00' AS datetime) 
    UNION 
    SELECT 
    'Amy', 
    CAST('2010-01-01 15:30:00' AS datetime), 
    CAST('2010-01-02 10:30:00' AS datetime) 
) 
SELECT 
    Name, 
    Join_Date, 
    Exp_Date, 
    Diff = 
    dbo.fnGetDTPart('year', DATEPART(year, DiffDT)-1900) + 
    dbo.fnGetDTPart('month', DATEPART(month, DiffDT)-1) + 
    dbo.fnGetDTPart('day', DATEPART(day, DiffDT)-1) + 
    dbo.fnGetDTPart('hour', DATEPART(hour, DiffDT)) + 
    dbo.fnGetDTPart('minute', DATEPART(minute, DiffDT)) + 
    dbo.fnGetDTPart('second', DATEPART(second, DiffDT)) 
FROM (
    SELECT 
    Name, 
    Join_Date, 
    Exp_Date, 
    DiffDT = Exp_Date - Join_Date 
    FROM Customer 
) s 
0

(アンドリー・Mさんのコメントで説明したように)あなたが実際に正しい日付の差をつけたいと仮定し、単にユーザーフレンドリーな方法でそれを表示するために探している、あなたはこれを行うことができます:

select Join_Date 
     ,Exp_Date 
     ,cast((datediff(hour,Join_Date,Exp_Date)/24) as nvarchar) + 'days ' 
     + cast((datediff(hour,Join_Date,Exp_Date) % 24) as nvarchar) + 'hours' as Diff 
関連する問題