44

假设我有一个日期时间字段,其值为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。我怎样才能得到想要的结果?

注意~如果我这样做SELECT dateadd(minute, -15,'2000-01-01 08:30:00');,我会得到想要的结果,但这涉及解析分钟字段。

编辑:

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

4

5 回答 5

76
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)
于 2010-02-22T05:38:22.767 回答
4

您想使用DATEADD,使用负持续时间。例如

DATEADD(minute, -15, '2000-01-01 08:30:00') 
于 2010-02-22T05:38:18.907 回答
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
于 2012-09-12T13:44:17.037 回答
2

你有没有尝试过

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

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

于 2010-02-22T05:39:15.120 回答
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')
于 2010-02-22T05:39:07.673 回答