2010-06-27 21 views
1

首先,讓我感謝您的幫助!創建SQL視圖,用實際變量替換變量對我無效

現在我正在將查詢轉換爲SQL中的視圖,因此我需要將所有變量替換爲實際值。但是,當我這樣做時,我遇到了麻煩。

當我有

DECLARE @TweleveAM datetime 
    set @TweleveAM = '1900-01-01 00:00:00' 
    DECLARE @TweleveThirtyAM datetime 
    set @TweleveThirtyAM = '1900-01-01 00:30:00' 

    WHEN (cast(segstart as float) - floor(cast(segstart as float))) >= 
(cast(@TweleveAM as float) - floor(cast(@TweleveAM as float))) 
and (cast(segstart as float) - floor(cast(segstart as float))) < 
(cast(@TweleveThirtyAM as float) - floor(cast(@TweleveThirtyAM as float))) 
THEN CAST('0' as int) 

,而是我用

WHEN (cast(segstart as float) - floor(cast(segstart as float))) >= 
(cast(cast('1900-01-01 00:00:00' as datetime)as float) - 
floor(cast(cast('1900-01-01 00:00:00' as datetime) as float))) 
and (cast(segstart as float) - floor(cast(segstart as float))) < 
(cast(cast('1900-01-01 00:00:30' as datetime) as float) - 
floor(cast(cast('1900-01-01 00:00:30' as datetime) as float))) 
THEN CAST('0' as int) 


ELSE Null End as Interval 

我的查詢產生空,而實際上數據是從來沒有空。

我在這裏做錯了什麼?

回答

1

它看起來像你正在使用SQLServer。與其將日期時間轉換爲浮點數來計算時間差異,我建議根據情況使用SQLServer的datediff函數以分鐘或秒參數。

3

我同意馬克,它看起來像這可以簡化。儘管回答你的問題。 這兩個版本不一樣。頂一個具有

DECLARE @TweleveThirtyAM datetime 
    set @TweleveThirtyAM = '1900-01-01 00:30:00' 

第二個有30 午夜

'1900-01-01 00:00:30' 

雖然你應該使用ISO格式1900-01-01T00:30:00.000反正。隨着您的查詢取代正確的值看起來像

SELECT 
    CASE 
    WHEN 
     (
     CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) 
    ) 
     >= (CAST(CAST('1900-01-01T00:00:00.000' AS DATETIME) AS FLOAT) - floor(CAST(CAST('1900-01-01T00:00:00.000' AS DATETIME) AS FLOAT))) 
    AND 
     (
     CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) 
    ) 
     < (CAST(CAST('1900-01-01T00:30:00.000' AS DATETIME) AS FLOAT) - floor(CAST(CAST('1900-01-01T00:30:00.000' AS DATETIME) AS FLOAT))) 
    THEN CAST('0' as int) 
    ELSE NULL 
    END AS Interval 
FROM T 

這可以簡化爲

SELECT 
    CASE 
    WHEN 
     (
     CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) 
    ) 
     >= 0 
    AND 
     (
     CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) 
    ) 
     < 1.0/48 
    THEN 0 
    ELSE NULL 
    END AS Interval 
FROM T 

我不認爲第一部分可以永遠是假的,這樣可以去除,以及留下

SELECT 
    CASE 
    WHEN 
     CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) < 1.0/48 
    THEN 0 
    ELSE NULL 
    END AS Interval 
FROM T 

這可能是更清晰的

SELECT 
    CASE 
    WHEN 
     DATEPART(HOUR, segstart) = 0 AND DATEPART(MINUTE, segstart < 30) 
    THEN 0 
    ELSE NULL 
    END AS Interval 
FROM T 

另外(有些更具推測性),除非那半個小時對你的應用程序有特別的意義,否則我想知道這是否是一個更大的案例陳述的一部分,將日期分成48個半小時的時間間隔?如果是這樣,這可能會做這項工作。

SELECT 2 * DATEPART(HOUR, segstart) + DATEPART(MINUTE, segstart)/30 AS Interval 
+0

馬丁史密斯先生,你是天才! – CodingIsAwesome 2010-06-27 22:10:58