6

日時値の範囲を持つ日時列があります。この日時の値をすべて使用して別の列を作成しますが、10分の期間に切り捨てます。

だから、このようなもの:

datetimesent              |     ten_minute_column

2012-06-11 18:27:58.000   |     2012-06-11 18:20:00.000
2012-06-15 15:19:08.000   |     2012-06-15 15:10:00.000
...                       |

私が持っている最も遠いのは、それを微細なバケツスロットに入れることです。私はこれを行うことでこれを手に入れました:

SELECT DatetimeSent,
    DATEADD(Minute, DATEDIFF(Minute, 0, DatetimeSent), 0) AS Minute_bucket
FROM allrequests

しかし、10分のバケットスロットが必要です。

4

4 に答える 4

8

これを試して:

select dateadd(minute, datepart(minute, datetimesent) / 10 * 10, 
dateadd(hour, datediff(hour, 0,datetimesent), 0)) ten_minute_column
from 
(select cast('2012-06-11 18:27:58.000' as datetime) datetimesent
union all
 select cast('2012-06-15 15:19:08.000' as datetime)) a
于 2012-06-25T18:04:35.220 に答える
3

多くの関数を使用してこれを行うことができます。

WITH D AS
(   SELECT  CURRENT_TIMESTAMP [DateField]
    UNION ALL
    SELECT  DATEADD(MINUTE, 5, CURRENT_TIMESTAMP)
)
SELECT  DATEADD(MINUTE, (10 * FLOOR(DATEPART(MINUTE, DateField) / 10.0)) - DATEPART(MINUTE, DateField), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, DateField), 0)) AS RoundedDate
FROM    D

これの要点は、10分間隔を過ぎた分数を取り除き、これを実際の分数から差し引くことです(秒数は削除されます)。

一部の関数を結合に移動することで、これを少し整理できます。ただし、これによりパフォーマンスが向上するとは思いません(テストはまったく行われていません)

;WITH T AS
(   SELECT  Number,
            (10 * FLOOR(Number / 10.0)) - Number [RoundedDifference]
    FROM    (   SELECT  ROW_NUMBER() OVER(ORDER BY Object_ID) - 1 [Number]
                FROM    sys.All_Objects
            ) n
    WHERE   Number < 60
), D AS
(   SELECT  CURRENT_TIMESTAMP [DateField]
    UNION ALL
    SELECT  DATEADD(MINUTE, 5, CURRENT_TIMESTAMP)
)
SELECT  DateField,
        DATEADD(MINUTE, RoundedDifference, DATEADD(MINUTE, DATEDIFF(MINUTE, 0, DateField), 0)) [RoundedDate]
FROM    D
        INNER JOIN T
            ON DATEPART(MINUTE, DateField) = Number
于 2012-06-25T17:01:43.897 に答える
0
SELECT  DatetimeSent,
        Dateadd(ms, -Datepart(ms, Dateadd(minute, Datediff(minute, 0, 
                                                    Dateadd(minute, 
                                                    -Datepart(minute, 
                                                     datetimesent) 
                                                    %10, 
                                                    datetimesent)), 0 
                                                ) 
                ), Dateadd(minute, Datediff(minute, 0, Dateadd(minute, 
                                                       - 
                                   Datepart( 
                                   minute, 
                                                   datetimesent 
                                   )% 
                                   10, 
                                     datetimesent 
                                                   )), 0)) AS Minute_bucket
FROM   allrequests 
于 2012-06-25T17:07:05.593 に答える
0

ミリ秒がないと仮定すると、この方法で分と秒を取り除き、結果をグループ化できます。

SELECT DATEADD(SECOND, -(CONVERT(INT, RIGHT(CONVERT(CHAR(2),
  DATEPART(MINUTE, GETDATE())),1))*60)-(DATEPART(SECOND,GETDATE())), GETDATE());

テーブル (またはテーブルのサブセット) の最小日付と最大日付に基づいて、適切な数のタイムスロットを取得するクエリを次に示します。

DECLARE @x TABLE(datetimesent DATETIME);
INSERT @x SELECT '2012-06-11 18:27:58.000'
UNION ALL SELECT '2012-06-15 15:19:08.000';

DECLARE @start SMALLDATETIME, @end SMALLDATETIME, @i INT;

SELECT @start = CONVERT(DATE, MIN(datetimesent)), @end = CONVERT(DATE,
MAX(datetimesent))
FROM @x
-- WHERE ...;

SELECT @i = DATEDIFF(DAY, @start, @end) * 144;

;WITH slots(ten_minute_column) AS
(
   SELECT TOP (@i * 144) DATEADD(MINUTE, 10 * (ROW_NUMBER() OVER
   (ORDER BY s1.[object_id])-1), @start)
   FROM sys.all_columns AS s1
   -- you may need to cross join to another table if this doesn't
   -- provide enough rows. Depends on overall datediff...
)
SELECT x.datetimesent, slots.ten_minute_column
 FROM @x AS x
 INNER JOIN slots
 ON x.datetimesent >= slots.ten_minute_column
 AND x.datetimesent < DATEADD(MINUTE, 10, slots.ten_minute_column)
 -- WHERE ...;

結果:

datetimesent              ten_minute_column
-----------------------   -------------------
2012-06-11 18:27:58.000   2012-06-11 18:20:00
2012-06-15 15:19:08.000   2012-06-15 15:10:00
于 2012-06-25T16:54:29.503 に答える