Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中获取日期时间差的值_Sql_Sql Server - Fatal编程技术网

如何在SQL Server中获取日期时间差的值

如何在SQL Server中获取日期时间差的值,sql,sql-server,Sql,Sql Server,有人知道如何在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 例如: 如果我有一个具有以下列的表格呼叫客户 Name

有人知道如何在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
例如:

如果我有一个具有以下列的表格呼叫客户

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
使用DATEDIFF:

还是超级花哨的版本

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

我的解决方案假设您需要英文的日期/时间部分名称,并使用自定义项

它计算日期时间之间的实际差异,即如果
Exp\u Date
是今天,而
Join\u 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

假设您想要实际正确的日期差异(如Andrey 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

您显示的差异值有些令人困惑。你的意思是分别计算日期部分差异和时间部分差异,还是这些只是任意数字?我的意思是
2010-01-01 12:30:00
2010-01-03 11:30:00
之间的实际差异是1天23小时。但是您似乎显示了日期差和时间差,这两个值是独立计算的。
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