2011-06-24 117 views
2

我試圖讓適合在時隙從一個表,其中從數據庫中獲得

  • 時隙開始在當前日期時間地板滿小時
  • 時隙兩端一定日期時隙在當前日期時間地板到整小時加2小時

這樣一個DateTime是2011-06-24 09:21:40.020可能是之間:

2011-06-24 09:00:00.000 AND 2011-06-24 11:00:00.000 

目前我已經得到了這一點,但我覺得嵌套DATEADD是多餘的。有沒有更乾淨的方法來做到這一點?

SELECT  dbo.Computer.ComputerName, dbo.Planned.DatePlanned 
FROM  dbo.Computer INNER JOIN 
      dbo.Planned ON dbo.Computer.ComputerID = dbo.Planned.ComputerID 
WHERE  dbo.Planned.DatePlanned 
BETWEEN 
(SELECT DATEADD(Hour, DATEDIFF(Hour, 0, GETDATE()), 0)) 
AND 
(SELECT DATEADD(Hour, DATEDIFF(Hour, 0, DATEADD(Hour, 2, GETDATE())), 0)) 

這應該會給我在當前活動時間段內的所有ComputerNames和Planned Dates。

回答

1

我認爲這是清潔定義這兩個變量:

DECLARE @Start DATETIME = DATEADD(Hour, DATEDIFF(Hour, 0, GETDATE()), 0) 
DECLARE @End DATETIME = DATEADD(Hour, 2, @Start) 

SELECT dbo.Computer.ComputerName, dbo.Planned.DatePlanned 
FROM dbo.Computer 
    INNER JOIN dbo.Planned ON 
     dbo.Computer.ComputerID = dbo.Planned.ComputerID 
WHERE dbo.Planned.DatePlanned 
BETWEEN @Start AND @End 
1

我想不出一個數學更清潔的方式做到這一點;但從代碼嗅覺的角度來看,你可以編寫一個UDF(自SQL 2000以來支持)。你可以從UDF中獲得額外的性能,並在計算列中使用它(假設它在兩種情況下都是模式綁定的)。

CREATE FUNCTION [dbo].[DateTimeHourFloor] 
(
    @DateTime DATETIME 
) 
RETURNS DATETIME 
WITH SCHEMABINDING -- A little more perf. 
AS BEGIN 
    RETURN DATEADD(Hour, DATEDIFF(Hour, 0, @DateTime), 0); 
END; 

然後,您可以使用它作爲這樣的:

SELECT  dbo.Computer.ComputerName, dbo.Planned.DatePlanned 
FROM  dbo.Computer INNER JOIN 
      dbo.Planned ON dbo.Computer.ComputerID = dbo.Planned.ComputerID 
WHERE  dbo.Planned.DatePlanned 
BETWEEN [dbo].[DateTimeHourFloor](GETDATE()) 
    AND [dbo].[DateTimeHourFloor](DATEADD(Hour, 2, GETDATE()));