2009-09-22 86 views
0

我有一个存储过程,循环遍历财年的几个月,并为每个月的项目计数。我知道有一个事实,有176个项目,但是当我运行它时,它返回的总计数是182。我尝试从@EndDate中删除一秒,但是我的总计数是165.因此,我要么计数项目两次,要么不包括所有这些。任何人都可以帮助我在这里做错了吗?下面是我在做什么一个精简版:在DATETIME中使用BETWEEN的SQL Server查询问题

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 
+0

yat.date_received是什么类型的? – 2009-09-22 18:19:16

+0

忽略与类型101的转换,这只是我发布此代码之前正确的事。他们是日期时间字段,并且我试图与直接日期时间值 – Jhorra 2009-09-22 18:28:17

回答

0

从我的头顶开始。

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)[email protected] 
GROUP BY DATEPART(month, yat.Date) 
ORDER BY DATEPART(month, yat.Date) 
+0

当然,在此之后,您需要总计()计数... – 2009-09-22 18:01:18

+0

除了我需要执行一个从7月份开始的会计年度外,此工作正常。 – Jhorra 2009-09-22 18:13:11

+0

这足够接近我需要的,我可以修改它使其工作。 – Jhorra 2009-09-22 18:17:32

1

之间是包容性的,所以你的1秒的减应该在那里(甚至一天)。我的猜测是,有些yais没有相应的yat。

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

+0

+1比较,因为无法与格式101进行比较,除了相等。 – 2009-09-22 18:18:17

+0

对不起,我原本没有101转换,那只是我尝试过的。我必须复制该代码而不是整个日期的实际代码 – Jhorra 2009-09-22 18:26:07

0

我常说的有趣的事情就像我知道的一个事实是有50个项目和SQL返回60 ...

我发现我总是错的! :)

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

DATEADD(d,DATEDIFF(d,0,GETDATE()),0)

+0

我知道这个数字是因为我做了一个计数。另外我还有其他报告查询以其他方式将其分解。除了当我按月分解时,我所有的数字都匹配。 – Jhorra 2009-09-22 18:14:32

0

你不能做到这一点呢?以下查询会给你按月份分组的计数。如果你把这个视图中,你就可以从视图中选择并使用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) 
0

这是不必要的循环的一个经典案例是SQL

SELECT 
     COUNT(yai.ID) 

到:代码,但如果你想用一个循环来解决这个问题,在循环从改变你的选择

SELECT 
    @Date,@EndDate,* 

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

0

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

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' 
0

我发现这个问题,因为我有很多麻烦与使用之间的查询使用字符串日期,我用,我同事帮助了我,所以我希望这也能帮助你:

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