从SQL Server 2005中的DateTime减去分钟

时间:2010-02-22 05:35:24

标签: sql-server tsql datetime sql-server-2005 dateadd

假设我有一个日期时间字段,其值为 2000-01-01 08:30:00 和持续时间字段,其值为 00:15 (表示15分钟)

如果我减去这两项,我应该 2000-01-01 08:15:00

此外,如果我想减去 1:15 (表示1小时15分钟),输出应为 2000-01-01 07:15:00

我正在尝试SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');

但是输出是52595055.我怎样才能得到理想的结果?

N.B.~如果我SELECT dateadd(minute, -15,'2000-01-01 08:30:00');,我会得到所需的结果,但这涉及解析分钟字段。

编辑:

根据答案,每个人都建议将所有内容转换为分钟然后减去 - 所以如果是1:30,我需要减去90分钟。没关系。没有转换成分钟的任何其他方式?

5 个答案:

答案 0 :(得分:52)

SELECT DATEADD(minute, -15, '2000-01-01 08:30:00'); 

第二个值(在这种情况下为-15)必须是数字(即不是像'00:15'那样的字符串)。如果您需要减去小时和分钟,我建议在以下位置拆分字符串:获取小时和分钟并使用

之类的方法减去
SELECT DATEADD(minute, -60 * @h - @m, '2000-01-01 08:30:00'); 

其中@h是字符串的小时部分,@ m是字符串的分钟部分

编辑:

这是一个更好的方法:

SELECT CAST('2000-01-01 08:30:00' as datetime) - CAST('00:15' AS datetime)

答案 1 :(得分:4)

您希望使用DATEADD,使用负时长。 e.g。

DATEADD(minute, -15, '2000-01-01 08:30:00') 

答案 2 :(得分:3)

你试过吗

SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')

DATEDIFF是2个日期之间的差异。

答案 3 :(得分:2)

我花了一些时间尝试做同样的事情,试图从hours:minutes中减去datetime - 这就是我的做法:

convert( varchar, cast((RouteMileage / @average_speed) as integer))+ ':' +  convert( varchar, cast((((RouteMileage / @average_speed) - cast((RouteMileage / @average_speed) as integer)) * 60) as integer)) As TravelTime,

dateadd( n, -60 * CAST( (RouteMileage / @average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime 

输出:

DeliveryDate                TravelTime             DepartureTime
2012-06-02 12:00:00.000       25:49         2012-06-01 10:11:00.000

答案 4 :(得分:1)

使用DATEPART拉开间隔,DATEADD减去部分:

select dateadd(
     hh,
    -1 * datepart(hh, cast('1:15' as datetime)),
    dateadd(
        mi,
        -1 * datepart(mi, cast('1:15' as datetime)),
        '2000-01-01 08:30:00'))

或者,我们可以先转换为分钟(虽然OP不愿意):

declare @mins int
select @mins = datepart(mi, cast('1:15' as datetime)) + 60 * datepart(hh, cast('1:15' as datetime)) 
select dateadd(mi, -1 * @mins, '2000-01-01 08:30:00')