2017-01-20 38 views
0

NEWBIE ALERT! 我想创建一个查询来查找特定日期的对象。例如,我想查看1/20/17打印的记录,仅此一天。我可以做到这一点没有问题,但我正在努力弄清楚如何做一天。 任何有识之士感激! 谢谢!SSRS 2016,查询单日

SSRS报告结果

SQL工作室导致

+1

如果您只需要一天的数据,则必须将范围的结束日期设置为与开始日期相同。 –

+0

为什么甚至设置一个范围。只要有'i.print_date = @ sdate' –

+0

我知道你在说什么,我试过这样做,但它什么都没有返回。我将该参数添加到报告中,以便我可以看到它是如何填充的,并将“1/20/17 12:00:00 AM”显示为值。我可以在sql studio中执行此类操作,它的作用是“order_date BETWEEN '09/30/16 00:00:00:000'AND '09/30/16 23:59:59:999'”但不确定如何将其转换为SSRS – cspell

回答

-1

这应该工作:

declare @sdate date 
set @sdate = DateAdd(day,-1,getdate()) 

declare @edate date 
set @edate =getdate() 

SELECT i.print_date 

FROM dbo.WC_view_bill_hdr AS i 
JOIN dbo.WC_view_customer AS c ON i.customer_id = c.customer_id 
JOIN WC_view_bill_batch AS ib ON ib.bill_batch_uid = c.bill_batch_uid 

    WHERE 
i.print_date between @sdate and @edate 
+0

因此,您将返回2天的数据。不是OP想要的。 –

+0

不,它会将数据从当前时间返回到24小时制造者 –

+0

但是数据类型是'Date'而不是'Datetime',所以它将包含昨天和今天。 2天。 –

1

如果您print_datedatetime字段,而不仅仅是date,您需要考虑time元素。通过这个我的意思是2017-01-20 13:48:00实际上并不等于2017-01-20,因为SQL Server在00:00:00时间上偷偷地增加了,而两者不再匹配。

为了解决这个问题,你可以你datetime值转换为date或全部在同一时间,但这降低了查询优化器,使您的查询更高效的能力,如需要读取和转换的每个值然后比较。

相反,你的优化器不会减慢您需要保留所谓的SARGability,只是做datetime值与其他datetime值的比较:

declare @sdate date -- Remember that date types add 00:00:00 when compared to datetime. 
set @sdate ='20172001' -- Make this the date you want values for. 

declare @edate date 
set @edate ='20172002' -- Make this the day *after* the date you want values for. 
         -- To save changing two values, you could just calculate 
         -- this value using dateadd(d,1,@sdate). 

select i.print_date 
from dbo.WC_view_bill_hdr as i 
    join dbo.WC_view_customer as c 
     on i.customer_id = c.customer_id 
    join WC_view_bill_batch as ib 
     on ib.bill_batch_uid = c.bill_batch_uid 
where i.print_date >= @sdate -- All values from the very start of this date. 
    and i.print_date < @edate; -- but that are less than the day after. 

如果你做你的日期比较以这种方式,SQL Server可以最有效地使用您在表格上的任何索引以及为更准确的datetime值添加未来校对程度:

例如,datetime仅准确到3毫秒,所以耳朵在明天击中之前的最低价值(2017-01-21)将为2017-01-20 23:59:59:997。如果将您的查询设置为between '2017-01-20 00:00:00.000' and '2017-01-20 23:59:59:997',那么存在3毫秒的差距,即尚未的问题。

但是,如果你搬到datetime2可以代表值超过997毫秒时,你是你不应该是现在明确地和错误地排除值。

这是一个无限的问题,因为在'明日之初'之前的'今日结束'没有价值,不能进一步划分为无穷大。

但只需指定Greater than or equal to the start of todayless than the start of tomorrow您将获得一切。

+0

谢谢,这是有道理的,我现在正在获取结果,但我只得到一行? – cspell

+0

@cspell无法看到您的数据,我们无法帮助解决这个问题。您是否能够将相关数据和预期输出添加到您的问题中? – iamdave

+0

我在上面添加了两个截图。它不会让我悲伤添加,我似乎无法添加任何意见,感叹。它显示了来自两个地方的输出。参数设置为日期时间,谢谢 – cspell