1

ある列の時間を元の時間 (例: 23:33:00.0000000 は 23:00 になります) で開始するように丸め、別の列の時間を次の時間 (例: 23:33) に丸める関数を作成する必要があります。 :00.0000000 は 24:00 になります)、これらの新しい値を新しい列に挿入します。How to Round a Time in T-SQL のStack Overflow でこの関数を見つけましたが、関数を実行できません。「Msg 156, Level 15, State 1, Procedure RoundTime, Line 11 Incorrect syntax near the keyword 'SELECT'.」というエラー メッセージが表示され続けます。

CREATE 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
END
SELECT [dbo].[RoundTime] ('23:33',0.0)

また、 SELECT dbo.roundtime('23:33',0.0) で実行しようとしましたが、まだ喜びはありません。

そのため、この関数を実行して時間を丸める方法を試してみたいと思っていましたが、実行することさえできません。とにかく、時間を最初の時点に戻すための最良の方法がわかりません。タイムスタンプから時間を抽出し、その時間を新しい列に挿入するだけでよいでしょうか? または、その場で変換してから新しい列に挿入する方法はありますか? SQL Server 2008 を使用しています。

4

3 に答える 3

5

関数は、参照する前に存在している必要があります。関数宣言の後に GO を追加して、作成と使用を分離します。

CREATE 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
END
GO

SELECT [dbo].[RoundTime] ('23:33',0.0)
于 2012-04-24T20:05:16.893 に答える
0

構文エラーが発生する理由はわかりませんが、それを実行するとゼロ除算エラーが発生します。関数が 2 番目のパラメーターに 0 を指定して実行されることを意図していたとは思いません。しかし、それでは切り捨てられないと思います。その場合、次の時間に切り上げる 2 番目のパラメーターに 1 を使用し、dateadd -1 時間を実行して戻ることができます。(または機能を強化します)。

于 2012-04-24T20:19:05.373 に答える
0

SET @Multiplier= 24.0/@RoundTo0.0の値を渡しています。 を渡すと@RoundTo どうなります1.0か?

実行したので、関数を削除して、次のように置き換えます。

CREATE FUNCTION [dbo].[RoundTime] 
(
    @Time datetime, 
    @RoundTo float
) 
RETURNS datetime 
AS 
BEGIN    
    DECLARE @RoundedTime datetime    
    DECLARE @Multiplier float    
    SET @Multiplier= 24.0/@RoundTo    
    SET @RoundedTime= FLOOR(CAST(CAST(CONVERT(varchar,@Time,121) AS datetime) AS float) * @Multiplier)/@Multiplier    
    RETURN @RoundedTime 
END 

@RoundedTime 変数を smalldatetime から datetime に切り替えると、時刻の破棄が停止しました。に変更RoundするFloorと、探している最初の数字が得られ、常にそれに 1 時間を追加していることがわかります。関数の名前を変更して、現在行っていることと一致させることができます...

ああ、2 番目のパラメータは 1.0 にする必要があります ( SELECT [dbo].[RoundTime] ('23:33:45',1.0))

于 2012-04-24T20:05:06.913 に答える