【问题标题】:Subtract minute from DateTime in SQL Server 2005从 SQL Server 2005 中的 DateTime 中减去分钟
【发布时间】:2011-01-19 12:34:11
【问题描述】:

假设我有一个日期时间字段,其值为 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 分钟。没关系。有没有其他方法不转换为分钟?

【问题讨论】:

  • 最好为开始和结束存储完整的 DATETIME 值

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用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')
    

    【讨论】:

    • 所以你的意思是说把所有的东西都转换成分钟然后减去,如果它是 1:30 意味着我需要减去 90 分钟。没关系。有没有其他方法不转换为分钟?
    【解决方案3】:
    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:30 意味着我需要减去 90 分钟。没关系。有没有其他方法不转换为分钟?
    • 抱歉,在我意识到我没有提供一个很好的解决方案后,我编辑了我的答案;乘以 1440(一天中的分钟数)将天转换为分钟。以前我将日期时间转换为浮点数以获得代表天数的数字,因此转换..我已经改变了我的答案,因此它根本不需要转换为分钟
    【解决方案4】:

    你试过了吗

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

    DATEDIFF 是两个日期之间的差。

    【讨论】:

    • 所以你的意思是说把所有的东西都转换成分钟然后减去,如果它是 1:30 意味着我需要减去 90 分钟。没关系。有没有其他方法不转换为分钟?
    【解决方案5】:

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

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

    【讨论】:

    • 所以你的意思是说把所有的东西都转换成分钟然后减去,如果它是 1:30 意味着我需要减去 90 分钟。没关系。有没有其他方法不转换为分钟?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2023-03-13
    • 2011-04-25
    • 2011-05-15
    • 2011-06-07
    相关资源
    最近更新 更多