如何在SQL Server中获取日期时间差的值
有人知道如何在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
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