创建SQL视图,用实际变量替换变量对我不起作用

创建SQL视图,用实际变量替换变量对我不起作用,sql,views,Sql,Views,首先,让我感谢你的帮助 现在,我正在将查询转换为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(segst

首先,让我感谢你的帮助

现在,我正在将查询转换为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
我的查询生成Null,而事实上数据从来都不是Null


我做错了什么?

看起来您正在使用SQLServer。我建议使用SQLServer的datediff函数和minute或second参数(视情况而定),而不是将datetimes转换为浮点数来计算时差。

看起来您使用的是SQLServer。我建议使用SQLServer的datediff函数和minute或second参数(视情况而定),而不是将datetimes转换为浮点数来计算时差。

我同意Mark的观点,它看起来可以简化。不过我想回答你的问题。 这两个版本不一样。最上面的有

 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

我同意马克的观点,这看起来是可以简化的。不过我想回答你的问题。 这两个版本不一样。最上面的有

 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 2 * DATEPART(HOUR, segstart) +  DATEPART(MINUTE, segstart) / 30 AS Interval