3

我想在 stroed 过程中获取两个日期时间之间的时差。然后我需要将该答案转换为 varchar。我不知道如何获得该值。我是 stroed 程序的新人。我正在使用 sql server 2008

declare @tdate1 datetime
declare @date2 datetime
declare @finaltime varchar

set @enddate = '2004-10-18 07:53:35.000'
set @startdate = '2004-10-18 15:28:57.000'

if @startdate >= @enddate
// This is what i want to do..

else
4

5 回答 5

18
SELECT DATEDIFF(year, @startdate, @enddate)

试试这个,让你朝着正确的方向前进。

year表示您要返回的测量周期

是指向可能有帮助的 MSDN 文章的链接

DATEDIFF(事务处理 SQL)

其他版本

更新日期:2015 年 12 月 2 日

本主题适用于:

是SQL Server(从 2008 年开始) 是Azure SQL 数据库 是Azure SQL 数据仓库 是并行数据仓库 返回指定开始日期和结束日期之间跨越的指定日期部分边界的计数(有符号整数)。有关更大的差异,请参阅 DATEDIFF_BIG (Transact-SQL)。有关所有 Transact-SQL 日期和时间数据类型和函数的概述,请参阅日期和时间数据类型和函数 (Transact-SQL)。主题链接图标 Transact-SQL 语法约定 语法

DATEDIFF ( datepart , startdate , enddate )

-- Azure SQL 数据仓库和并行数据仓库

DATEDIFF (datepart ,startdate ,enddate )

论据

日期部分

是 startdate 和 enddate 的一部分,用于指定跨越边界的类型。下表列出了所有有效的 datepart 参数。用户定义的等效变量无效。

日期部分

缩写

year
yy, yyyy
quarter
qq, q
month
mm, m
dayofyear
dy, y
day
dd, d
week
wk, ww
hour
hh
minute
mi, n
second
ss, s
millisecond
ms
microsecond
mcs
nanosecond
ns
startdate

是一个可以解析为time, date, smalldatetime, datetime, datetime2、 或 datetimeoffset 值的表达式。date 可以是表达式、列表达式、用户定义的变量或字符串文字。从 enddate 中减去 startdate。

为避免歧义,请使用四位数年份。有关两位数年份的信息,请参阅配置两位数年份截止服务器配置选项。结束日期

请参阅开始日期返回类型 int 返回值 每个日期部分及其缩写返回相同的值。如果返回值超出 int 的范围(-2,147,483,648 到 +2,147,483,647),则返回错误。对于毫秒,startdate 和 enddate 之间的最大差异是 24 天 20 小时 31 分钟和 23.647 秒。其次,最大差异是 68 岁。如果 startdate 和 enddate 都只分配了一个时间值,并且 datepart 不是时间 datepart,则返回 0。startdate 或 endate 的时区偏移分量不用于计算返回值。因为 smalldatetime 仅精确到分钟,所以当 smalldatetime 值用于 startdate 或 enddate 时,返回值中的秒和毫秒始终设置为 0。如果仅将时间值分配给日期数据类型的变量,缺失日期部分的值设置为默认值:1900-01-01。如果仅将日期值分配给时间或日期数据类型的变量,则将缺失时间部分的值设置为默认值:00:00:00。如果 startdate 或 enddate 中只有一个时间部分而另一个只有一个日期部分,则缺少的时间和日期部分将设置为默认值。如果 startdate 和 enddate 是不同的日期数据类型,并且其中一个的时间部分或小数秒精度比另一个多,则另一个的缺失部分设置为 0。 datepart 边界 以下语句具有相同的 startdate 和相同的 endate。这些日期是相邻的,时间相差 0.0000001 秒。每个语句中的 startdate 和 endate 之间的差异跨越其日期部分的一个日历或时间边界。每个语句返回 1。

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');

备注 DATEDIFF 可用于选择列表、WHERE、HAVING、GROUP BY 和 ORDER BY 子句。DATEDIFF 将字符串文字隐式转换为 datetime2 类型。这意味着当日期作为字符串传递时,DATEDIFF 不支持格式 YDM。您必须将字符串显式转换为 datetime 或 smalldatetime 类型才能使用 YDM 格式。指定 SET DATEFIRST 对 DATEDIFF 没有影响。DATEDIFF 始终使用星期日作为一周的第一天,以确保函数具有确定性。示例 下面的示例使用不同类型的表达式作为 startdate 和 enddate 参数的参数。A. 为 startdate 和 enddate 指定列 下面的示例计算表中两列中日期之间跨越的天数。

CREATE TABLE dbo.Duration
    (
    startDate datetime2
    ,endDate datetime2
    );
INSERT INTO dbo.Duration(startDate,endDate)
    VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09');
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;

-- 返回: 1 B. 为 startdate 和 enddate 指定用户定义的变量 下面的示例使用用户定义的变量作为 startdate 和 enddate 的参数。

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722'; 
SELECT DATEDIFF(day, @startdate, @enddate);

C. 为 startdate 和 enddate 指定标量系统函数 下面的示例使用标量系统函数作为 startdate 和 enddate 的参数。

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());

D. 为 startdate 和 enddate 指定标量子查询和标量函数 下面的示例使用标量子查询和标量函数作为 startdate 和 enddate 的参数。使用 AdventureWorks2012;去

SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
    (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

E. 为 startdate 和 enddate 指定常量 下面的示例使用字符常量作为 startdate 和 enddate 的参数。

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635');

F. 为 enddate 指定数值表达式和标量系统函数 以下示例使用数值表达式 (GETDATE ()+ 1) 和标量系统函数 GETDATE 和 SYSDATETIME 作为 enddate 的参数。

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE()+ 1) 
    AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day,1,SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G. Specifying ranking functions for startdate
The following example uses a ranking function as an argument for startdate.
USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
    ,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s 
    INNER JOIN Person.Person p 
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address a 
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

H. 为 startdate 指定聚合窗口函数 下面的示例使用聚合窗口函数作为 startdate 的参数。

USE AdventureWorks2012;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty,soh.OrderDate
    ,DATEDIFF(day,MIN(soh.OrderDate) 
        OVER(PARTITION BY soh.SalesOrderID),SYSDATETIME() ) AS 'Total'
FROM Sales.SalesOrderDetail sod
    INNER JOIN Sales.SalesOrderHeader soh
        ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659,58918);
GO

示例:Azure SQL 数据仓库公共预览版和并行数据仓库 以下示例使用不同类型的表达式作为 startdate 和 enddate 参数的参数。I. 为 startdate 和 enddate 指定列 下面的示例计算表中两列中日期之间跨越的天数。

CREATE TABLE dbo.Duration (
    startDate datetime2
    ,endDate datetime2
    );
INSERT INTO dbo.Duration(startDate,endDate)
    VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09');
SELECT TOP(1) DATEDIFF(day,startDate,endDate) AS Duration
FROM dbo.Duration;

-- 返回: 1 J. 为 startdate 和 enddate 指定标量子查询和标量函数 下面的示例使用标量子查询和标量函数作为 startdate 和 enddate 的参数。-- 使用 AdventureWorks

SELECT TOP(1) DATEDIFF(day,(SELECT MIN(HireDate) FROM dbo.DimEmployee),
    (SELECT MAX(HireDate) FROM dbo.DimEmployee)) 
FROM dbo.DimEmployee;

K. 为 startdate 和 enddate 指定常量 下面的示例使用字符常量作为 startdate 和 enddate 的参数。

-- Uses AdventureWorks

SELECT TOP(1) DATEDIFF(day, '2007-05-07 09:53:01.0376635'
    , '2007-05-08 09:53:01.0376635') FROM DimCustomer;

L. 为 startdate 指定排名函数 下面的示例使用排名函数作为 startdate 的参数。-- 使用 AdventureWorks

SELECT FirstName, LastName
,DATEDIFF(day,ROW_NUMBER() OVER (ORDER BY 
        DepartmentName),SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;

M. 为 startdate 指定聚合窗口函数 下面的示例使用聚合窗口函数作为 startdate 的参数。-- 使用 AdventureWorks

SELECT FirstName, LastName, DepartmentName
    ,DATEDIFF(year,MAX(HireDate)
             OVER (PARTITION BY DepartmentName),SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee
于 2012-10-02T17:05:11.117 回答
3

结帐日期。这是如何使用它的演示

SELECT DATEDIFF(day, [Start], [End]) AS [Days],
   DATEDIFF(minute, [Start], [End]) AS [Minutes],
   DATEDIFF(second, [Start], [End]) AS [Seconds] FROM Dates;
于 2012-10-02T17:04:23.947 回答
1

假设您想以天计算两个日期之间的差异,这是我的建议:

DECLARE @start DATETIME = '01-01-2000', 
      @end DATETIME = GETDATE() 

SELECT CAST(ABS(DATEDIFF(day, @end, @start)) AS VARCHAR(100)) 

我假设你总是想要一个肯定的答案,所以 ABS 允许你忽略日期的顺序。您在帖子中提到您想要最终答案为 Varchar,所以我加入了一个演员表。

希望这对您有所帮助。

于 2012-10-03T09:19:15.957 回答
1

使用 DATEDIFF() 你可以得到秒差、分钟差、小时差……等等。但是如果你想以清晰的方式得到日期/时间差,你可以做这样的事情。.

declare @StartDate datetime, @EndDate datetime

select @StartDate = '04/07/2015 05:01:23.000',@EndDate='04/08/2015 10:32:30.000'

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [HH:MM:SS]

输出格式为 [HH:MM:SS] : 05:31:07

我认为这是在 SQL 中获取两个日期时间之间时差的最佳方法

于 2015-04-08T05:13:10.087 回答
0

这是我以前使用过的,非常短的代码:

选择 CAST((@EndDateTime-@StartDateTime) as time(0)) '[hh:mm:ss]'

于 2014-09-03T16:34:08.700 回答