【问题标题】:How to get Time difference Between Datetime, Date and Time columns如何获取日期时间、日期和时间列之间的时差
【发布时间】:2011-10-27 15:00:47
【问题描述】:

我有一个名为 Data_Details 的表,数据如下:

DateTimeClosed            Datesub            TimeSub
6/20/2011 18:00           5/16/2011          17:13:17
6/20/2011 18:00           5/18/2011          13:45:17
6/1/2011 19:00            5/24/2011          8:30:12

我试图以分钟为单位计算关闭日期和子日期之间的差异。

我是这样写的:

SELECT  convert(int,convert(Datetime,[DateTimeClosed])-
(convert(Datetime,[Datesub])+convert(datetime,[TimeSub])))*24*60 
FROM dbo.Data_details

它给了我以下错误:

消息 241,第 16 级,状态 1,第 2 行 从字符串转换日期和/或时间时转换失败。

谁能帮帮我?

【问题讨论】:

  • 请提供您的表结构(列的数据类型)
  • @Lamak 所有列都是 [varchar] (50) 数据类型

标签: sql-server tsql sql-server-2008 datetime


【解决方案1】:

这会返回以秒为单位的时间差:

select datediff(SECOND,'5/16/2011'+' '+'17:13:17','6/20/2011 18:00')

示例脚本:

declare @test as table
(
date1 datetime,
date2 date,
date3 time
)
insert into @test 
values
('6/20/2011 18:00'         ,  '5/16/2011'        ,  '17:13:17')
select Datediff(second,cast (date2 as varchar)+' '+ cast(date3 as varchar),date1) from @test

更新- 现在使用 varchars,OP 澄清它们都是 varchars:

declare @test as table
(
date1 varchar(50),
date2 varchar(50),
date3 varchar(50)
)
insert into @test 
values
('6/20/2011 18:00'         ,  '5/16/2011'        ,  '17:13:17')
select Datediff(second,cast (date2 +' '+date3 as datetime),cast (date1 as datetime)) from @test

【讨论】:

  • 在我的表中,所有数据类型都是 Varchar(50) 我也尝试过您的查询,但它给了我同样的错误
  • @Peter 我以为他们分别是日期时间、日期和时间。这就是您提出的问题:How to get Time difference Between Datetime, Date and Time columns。投射到它们各自的类型应该可以工作。让我配置
  • 我的错,但我已将数据类型放在上面的 cmets 中
  • @peter 添加了所有 varchar 类型的版本。这应该工作
【解决方案2】:

试试这个:

SELECT DATEDIFF(MINUTE,CONVERT(DATETIME,Datesub + ' ' + TimeSub,101),CONVERT(DATETIME,DateTimeClosed,101))
FROM yourTable

【讨论】:

  • @peter - 那么您的日期可能与您的示例格式不同,或者某个不可能的日期(例如 '13/13/2011')
  • 非常感谢,我刚刚发现有一条记录的价值类似于“关闭”,这就是导致错误的原因。如果我发现您的查询运行良好。再次感谢
【解决方案3】:

我想你在找DateDiff

此示例将返回分钟:

SELECT DATEDIFF(m, CONVERT(datetime, [Datesub] + ' ' + [TimeSub]), CONVERT(datetime, [DateTimeClosed]))
FROM dbo.Data_details

【讨论】:

    【解决方案4】:
    SET DATEFORMAT MDY
    ;with dates AS 
    (
    SELECT '6/20/2011 18:00' as datetimeclosed,'5/16/2011' as datesub,'17:13:17' as timesub UNION ALL
    SELECT '6/20/2011 18:00','5/18/2011','13:45:17' UNION ALL
    SELECT '6/1/2011 19:00','5/24/2011','8:30:12' 
    )
    SELECT
    DATEDIFF(minute,CAST(datesub + ' ' + timesub AS DATETIME),CAST(datetimeclosed AS DATETIME)) as time_diff_in_minutes
     FROM dates
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多