【问题标题】:T-SQL Convert String to Time for DATEDIFF() CalculationT-SQL 将字符串转换为时间以进行 DATEDIFF() 计算
【发布时间】:2020-12-29 04:48:59
【问题描述】:

我在将字符串转换为时间以便使用另一个合法时间字段执行 DATEDIFF() 计算时遇到问题。我的最终目标是在 SSRS 中创建报告。

我能够在 SSMS 中执行此任务的唯一方法是使用:

,CAST(msdb.dbo.agent_datetime('19000101', P.[3]+'00') AS TIME(0)) AS [Reached Time]

P.[3]是一个字符串字段(示例值为 0744)。由于“msdb.dbo.agent_datetime”的格式,我添加了毫秒的 +'00'。

以上在 SSMS 中完美运行,并给出 07:44:00 的值。但是,这个“msdb.dbo.agent_datetime”函数在 SSRS 中不起作用。仅当我删除任何提及“msdb.dbo.agent_datetime”时,我的报告才会运行。

我需要一种不同的方法来将此字符串值(例如 0744)更改为 07:44 或 07:44:00 的合法时间值。

我试过了:

FORMAT(CONVERT(INT,P.[3]), 'HH:mm', 'en-us') --Returns value of HH:mm

CONVERT(VARCHAR, P.[3], 24) --Returns value of 0744

CONVERT(TIME, P.[3]) --Returns value of 00:00:00.0000000

CAST(P.[3] AS TIME) --Returns value of 00:00:00.0000000

CAST(CONVERT(INT,P.[3]) AS TIME) --Explicit conversion from data type int to time is not allowed.

其他组合也会出错。我什至尝试在 SSRS 中格式化时间,但没有成功。

我可以通过修改字符串使它看起来像一个时间,但是不能用 DATEDIFF() 执行计算

请帮忙!

【问题讨论】:

    标签: sql-server tsql reporting-services ssms


    【解决方案1】:

    假设针对数据源设置的凭据的权限是正确的,我看不出为什么您不能在数据集查询中使用该函数。

    无论如何,要作弊,您可以在自己的数据库中重新创建函数并使用该版本。

    如果您在 SSMS 中运行以下命令

    USE msdb
    exec sp_helptext 'dbo.agent_datetime'
    

    你会得到如下脚本,

    CREATE FUNCTION agent_datetime(@date int, @time int)
    RETURNS DATETIME
    AS
    BEGIN
     RETURN
      (
        CONVERT(DATETIME,
              CONVERT(NVARCHAR(4),@date / 10000) + N'-' + 
              CONVERT(NVARCHAR(2),(@date % 10000)/100)  + N'-' +
              CONVERT(NVARCHAR(2),@date % 100) + N' ' +        
              CONVERT(NVARCHAR(2),@time / 10000) + N':' +        
              CONVERT(NVARCHAR(2),(@time % 10000)/100) + N':' +        
              CONVERT(NVARCHAR(2),@time % 100),
        120)
      )
    END
    

    使用它在您的数据库中创建相同的函数。

    当然,现在你知道这个函数有多简单了,你可以创建一个在一个步骤中完成整个转换的函数。

    【讨论】:

    • 谢谢,好建议,我会尝试重新创建它。看着那个,我认为问题是 SSRS 不知道如何在默认情况下引用 msdb 。
    【解决方案2】:

    这在 SSMS 上适用于我:

    declare @sourcetime char(4) = '1714'
    
    select cast(left(@sourcetime, 2) + ':' + right(@sourcetime, 2) as datetime)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 2020-01-12
      • 2020-01-18
      • 2017-10-15
      • 2014-09-26
      相关资源
      最近更新 更多