2010-06-27 3 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) 

이 그리고 사실에 데이터가 NULL 결코 없을 때 대신 내가

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를 사용하고있는 것처럼 보입니다. 시간차를 계산하기 위해 당신의 datetimes를 float으로 변환하는 대신에, SQLServer의 datediff 함수를 적절한 분 또는 두 번째 인수와 함께 사용하는 것이 좋습니다.

3

나는 이것이 단순 해 보일 수 있다는 마크에 동의합니다. 귀하의 질문에 대답합니다. 두 버전이 동일하지 않습니다. 상단 하나는 어쨌든 ISO 형식 1900-01-01T00:30:00.000을 사용해야하지만 두 번째는 자정

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

지난 30 있다

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

있습니다. 쿼리에 대체 올바른 값이

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 
0으로

또한 귀하의 애플리케이션에 30 분의 시간이 특별한 의미가 없다면 약간의 추측을 요합니다. 이것이 48 시간 반 간격으로 나누는 훨씬 더 큰 사례의 일부인지 궁금합니다. 그렇다면이 일을 할 수 있습니다.

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

Martin Smith, 당신은 천재입니다! – CodingIsAwesome

관련 문제