数据的SQL间隔

数据的SQL间隔,sql,sql-server,Sql,Sql Server,我正在做一个项目,需要一个时间间隔的数据,例如 我有一个数据是DECLARE@Time datetime='Jan 1 1900 9:54AM'预期结果是1900-01-01 09:30:00,但使用此查询 ALTER FUNCTION [dbo].[RoundTime] (@Time datetime, @RoundTo float) RETURNS datetime AS BEGIN DECLARE @RoundedTime smalldatetime DECLARE @Multiplier

我正在做一个项目,需要一个时间间隔的数据,例如

我有一个数据是
DECLARE@Time datetime='Jan 1 1900 9:54AM'
预期结果是
1900-01-01 09:30:00
,但使用此查询

ALTER FUNCTION [dbo].[RoundTime] (@Time datetime, @RoundTo float)
RETURNS datetime
AS
BEGIN
DECLARE @RoundedTime smalldatetime
DECLARE @Multiplier float

SET @Multiplier= 24.0/@RoundTo

SET @RoundedTime= ROUND(CAST(CAST(CONVERT(varchar,@Time,121) AS datetime) AS float) * @Multiplier,0)/@Multiplier

RETURN @RoundedTime
结束

我得到了这个结果,请告诉我你是怎么做到的。顺便说一句,我正在使用SQL数据库

编辑1:我使用
0.5
作为
@RoundTo
参数
编辑2:这就是我如何使用函数
,CONVERT(varchar,CONVERT(time,[dbo].[RoundTime](CAST(CAST([INTERVAL]as datetime)as varchar),0.5)),108)作为[INTERVAL]
您的函数被声明为返回一个
datetime
。这是日期/时间值的正确内部格式

您可以在较新版本的SQL Server中使用
format()
,或类似的内容:

convert(varchar(255), @RoundedTime, 109)
但是。在调用函数后执行此操作。该函数应返回一个
datetime
。您的格式只是一种演示格式。

alterfunction[dbo].[RoundTime](@Time-datetime)
ALTER FUNCTION [dbo].[RoundTime](@Time datetime)
RETURNS smalldatetime
as
Begin

Declare @RoundedTime  smalldatetime
SET @RoundedTime=
(Select 
case when datepart(minute,@Time)=0 and  datepart(second,@Time)=0 then  convert(varchar(10),@Time,121) 
     when datepart(minute,@Time)>30 and  datepart(second,@Time)=0 then dateadd(mi,30,cast(convert(varchar(14),@Time,121)+'00' as datetime))
     when datepart(minute,@Time)=30 and  datepart(second,@Time)=0 then cast(convert(varchar(16),@Time,121) as datetime)
     when datepart(minute,@Time)<30 and  datepart(second,@Time)=0 then dateadd(mi,0,cast(convert(varchar(14),@Time,121)+'00' as datetime))
end as 'Date') 

return @RoundedTime

end 
返回smalldatetime 作为 开始 声明@RoundedTime smalldatetime 设置@RoundedTime= (选择 当datepart(分钟,@Time)=0和datepart(秒,@Time)=0时,则转换为(varchar(10),@Time,121) 当datepart(分钟,@Time)>30且datepart(秒,@Time)=0时,则dateadd(mi,30,cast(将varchar(14),@Time,121)+00转换为datetime)) 当datepart(分钟,@Time)=30,datepart(秒,@Time)=0时,则将(varchar(16),@Time,121)转换为datetime)
当datepart(分钟,@Time)时,我用

 DECLARE @RoundedTime smalldatetime
 DECLARE @Multiplier float

 SET @Multiplier= 24.0/@RoundTo

 SET @RoundedTime= DATEADD(mi, DATEDIFF(mi, 0, @Time)/30*30, 0)

 RETURN @RoundedTime

@维安·奥杰达·加西亚试试这个,只是想知道@RoundTo float的目的是什么parameter@vian-ojeda garcia,如果您可以共享错误数据的示例,以便我可以更正它…它显示的数据比它应该显示的数据多,因为我也将此函数用于我的查询过滤器let us。