问题描述
我在将字符串转换为时间以便执行具有另一个合法时间字段的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()执行计算
请帮助!
解决方法
我看不到任何理由,假设您对针对数据源设置的凭据权限正确,则无法在数据集查询中使用该功能。
无论如何,要作弊,您可以在自己的数据库中重新创建该函数并使用该版本。
如果您在SSMS中运行以下内容
context.vwGetMeetings.ToList();
您将获得如下脚本,
USE msdb
exec sp_helptext 'dbo.agent_datetime'
使用它在数据库中创建相同的功能。
当然,现在您知道该功能有多简单,可以创建一个功能来一步完成整个转换。
,这对我在SSMS上有效:
declare @sourcetime char(4) = '1714'
select cast(left(@sourcetime,2) + ':' + right(@sourcetime,2) as datetime)