0

誰かがここで私を助けてくれますか?私は日付範囲の間の時間間隔のテーブルを取得しようとしています。

例えば:

if starttime == 2012-02-06 23:59:00'
then endtime = '2012-02-29 10:26:17'

次のような内容のテーブル(変数テーブル)が必要です。

Start                    End                      Seconds
2012-02-06 23:59:00.000  2012-02-06 23:59:00.000  0
2012-02-29 09:00:00.000  2012-02-29 09:59:00.000  3540
2012-02-29 10:00:00.000  2012-02-29 10:26:17.000  1577
4

4 に答える 4

1

予想されるテーブルを見ると、second2つの時間の間に差が出ています。

SELECT DATEDIFF(SECOND, '2012-02-29 09:00:00.000', '2012-02-29 09:59:00.000')秒の差である3540だけを与えます。

時間差を取得するには、次のコードを試すことができます。

SELECT  DATEDIFF(hour, '2012-02-06 23:59:00.000', '2012-02-06 23:59:00.000')
于 2012-07-13T10:21:59.353 に答える
0

提案とコメントをありがとうございました。私はついに問題を解決することでした。

以下は、私が思いついたソリューションのスクリプトです。

DECLARE @start_date datetime = CONVERT(DATETIME,'2012-02-06 23:59:01.000',20);
DECLARE @end_date datetime = CONVERT(DATETIME,'2012-12-08 23:59:17.000',20);
DECLARE @org datetime  ;
DECLARE @end datetime  ;
DECLARE @datetable TABLE (h_start datetime, h_end datetime,h_sesc int);

WHILE (dateadd(second, -1, dateadd(hour, datediff(hour, 0, @start_date)+1, 0))) < @end_date
BEGIN
SET @org = null;
SET @org = @start_date;
SET @end = (dateadd(second, -1, dateadd(hour, datediff(hour, 0, @org)+1, 0)));
INSERT INTO @datetable (h_start, h_end,h_sesc)
VALUES(dateadd(second, 0,@org), @end,DATEDIFF(second, @org,@end));

SET @start_date = dateadd(second, 1,@end);

END;


INSERT INTO @datetable (h_start, h_end,h_sesc)
VALUES(dateadd(second, 0,@start_date), @end_date,DATEDIFF(second, dateadd(second, 0,@start_date),@end_date));

SELECT * FROM @datetable;

上記の結果は次のようになります。

h_start                 h_end                   h_sesc
2012-02-06 23:59:01.000 2012-02-06 23:59:59.000 58
2012-02-07 00:00:00.000 2012-02-07 00:59:59.000 3599
2012-02-07 01:00:00.000 2012-02-07 01:59:59.000 3599
2012-02-07 02:00:00.000 2012-02-07 02:59:59.000 3599
2012-02-07 03:00:00.000 2012-02-07 03:59:59.000 3599
2012-02-07 04:00:00.000 2012-02-07 04:59:59.000 3599
2012-02-07 05:00:00.000 2012-02-07 05:59:59.000 3599

...。

2012-12-08 18:00:00.000 2012-12-08 18:59:59.000 3599
2012-12-08 19:00:00.000 2012-12-08 19:59:59.000 3599
2012-12-08 20:00:00.000 2012-12-08 20:59:59.000 3599
2012-12-08 21:00:00.000 2012-12-08 21:59:59.000 3599
2012-12-08 22:00:00.000 2012-12-08 22:59:59.000 3599
2012-12-08 23:00:00.000 2012-12-08 23:59:17.000 3557

誰かがそれが役に立つと思うことを願っています。

于 2012-07-17T11:04:09.640 に答える
0
DECLARE @start_date datetime = CONVERT(DATETIME,'2012-02-06 23:59:01.000', 20);
DECLARE @end_date datetime = CONVERT(DATETIME,'2012-12-08 23:59:17.000', 20);

-- Using a recursive query after round down to full hours avoids a loop. The resulting intervals should be easier to use that way, e.g. you can but don't have to insert them into a table variable.
SET @start_date = DATEADD(HOUR, DATEPART(HOUR, @start_date), CAST(FLOOR(CAST(@start_date AS float)) AS datetime));
SET @end_date = DATEADD(HOUR, DATEPART(HOUR, @end_date), CAST(FLOOR(CAST(@end_date AS float)) AS datetime));
WITH RecursiveTimeIntervals AS
(SELECT @start_date Interval
UNION ALL SELECT DATEADD(HOUR, 1, r.Interval)
FROM RecursiveTimeIntervals r
WHERE r.Interval < @end_date)
SELECT * 
FROM RecursiveTimeIntervals
ORDER BY 1
OPTION (MAXRECURSION 0)
于 2017-06-12T09:46:25.010 に答える
-1
DATEDIFF(hour, [start], [end]) 

w3schoolsの説明を参照してください。

于 2012-07-13T10:23:16.663 に答える