假设我有一个日期时间字段,其值为 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分钟。没关系。没有转换成分钟的任何其他方式?
答案 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)
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')