代码之家  ›  专栏  ›  技术社区  ›  Jhorra

SQL Server查询在WHERE WITH DATETIME中使用BETWEEN时出现问题

  •  0
  • Jhorra  · 技术社区  · 15 年前

    我有一个存储过程,它循环遍历会计年度中的各个月,并对每个月中的项目进行计数。我知道事实上有176个项目,但是当我运行这个项目时,它返回的总数是182个。我试着从@enddate删除一秒钟,但是我的总数是165。所以我要么数两次,要么不算全部。有人能帮我解决这里的问题吗?下面是我正在做的事情的精简版本:

    DECLARE @Date DATETIME
    DECLARE @EndDate DATETIME
    
    SELECT @Date = CAST((@Year - 1) as VARCHAR) + '-07-01'
    SELECT @EndDate = DATEADD(Month, 1, @Date)
    
    
    DECLARE @Count INT
    SELECT @Count = 0
    WHILE @Count < 12
    
    BEGIN
    
        SELECT 
            COUNT(yai.ID)
        FROM
            table_1    yai 
            INNER JOIN table_2 yat ON yai.ID = yat.ID 
        WHERE
            (yat.Date_Received BETWEEN CONVERT(VARCHAR, @Date, 101) AND CONVERT(VARCHAR, @EndDate, 101))  AND 
            yai.Pro_Type = @Value AND yat.Type = 'PC'
    
        SELECT @Count = @Count + 1
        SELECT @Date = DATEADD(MONTH, 1, @Date)
        SELECT @EndDate = DATEADD(MONTH, 1, @EndDate)
    
    END
    
    7 回复  |  直到 7 年前
        1
  •  0
  •   Jonas Elfström    15 年前

    从我的头顶。

    SELECT DATEPART(month, yat.Date) as month, COUNT(yai.ID)
    FROM table_1 yai 
    INNER JOIN table_2 yat ON yai.ID = yat.ID 
    WHERE
        yai.Pro_Type = @Value AND yat.Type = 'PC' 
        AND DATEPART(year, yat.Date)=@Year
    GROUP BY DATEPART(month, yat.Date)
    ORDER BY DATEPART(month, yat.Date)
    
        2
  •  1
  •   erikkallen    15 年前

    两者之间是包含的,所以您的1秒减法应该在那里(甚至是一天)。我猜有些yais没有对应的yat。

    编辑:你的代码是伪造的。除了与格式101相等之外,不能进行比较。

        3
  •  0
  •   JonH    15 年前

    我经常说一些有趣的事情,比如我知道有50个项目,而SQL返回了60个…

    我发现我总是错的!:)

    尝试从日期和时间字段中剥离时间:

    日期添加(d,datediff(d,0,getdate()),0)

        4
  •  0
  •   D'Arcy Rittich    15 年前

    你不能改成这样吗?下面的查询将提供按月份分组的计数。如果您将它放在视图中,那么您可以从视图中进行选择,并使用WHERE子句按您感兴趣的年份和月份进行筛选。

    select year(yat.Date_Received) as year, month(yat.Date_Received) as month, count(*) as count
        count(yai.ID)
    from table_1 yai 
    inner join table_2 yat on yai.ID = yat.ID 
    where yai.Pro_Type = 'some_value' 
        and yat.Type = 'PC'
    group by year(yat.Date_Received), month(yat.Date_Received)
    
        5
  •  0
  •   KM.    15 年前

    这是不必要循环的典型情况是SQL代码,但如果要用循环解决此问题,请将循环中的选择更改为:

     SELECT 
            COUNT(yai.ID)
    

    到:

     SELECT 
         @Date,@EndDate,*
    

    然后查看输出并检查返回的行

        6
  •  0
  •   Mike C.    15 年前

    为什么不将日历月份转换为这样的绝对整数引用:

    DECLARE @BeginDate datetime = '7/1/2008'
    DECLARE @EndDate datetime = '6/30/2009'
    --
    -- Convert calendar months into an absoulte integer:
    --
    DECLARE @BeginMonth int = (DatePart(year, @BeginDate) * 12) + DatePart(month, @BeginDate)
    DECLARE @EndMonth int = (DatePart(year, @EndDate) * 12) + DatePart(month, @EndDate)
    
    SELECT COUNT(yai.ID)
    FROM table_1 yai
    INNER JOIN table_2 yat ON yai.ID = yat.ID
    WHERE (DatePart(year, yat.Date_Received) * 12) + DatePart(month, yat.Date_Received) 
        BETWEEN @BeginMonth AND @EndMonth)
    AND yai.Pro_Type = @Value
    AND yat.Type = 'PC'
    
        7
  •  0
  •   Roshna Omer    7 年前

    我发现这个问题是因为我在使用 字符串日期 在查询中使用between和我正在使用 元数据 ,我的同事帮助了我,所以我希望这也能帮助你:

    N'convert(date,[fld_myDate]) Between  convert(date,''01/01/2016'') AND convert(date,''08/26/2017'') '