NEWBIE ALERT! 我想创建一个查询来查找特定日期的对象。例如,我想查看1/20/17打印的记录,仅此一天。我可以做到这一点没有问题,但我正在努力弄清楚如何做一天。 任何有识之士感激! 谢谢!SSRS 2016,查询单日
SSRS报告结果
SQL工作室导致
NEWBIE ALERT! 我想创建一个查询来查找特定日期的对象。例如,我想查看1/20/17打印的记录,仅此一天。我可以做到这一点没有问题,但我正在努力弄清楚如何做一天。 任何有识之士感激! 谢谢!SSRS 2016,查询单日
SSRS报告结果
SQL工作室导致
这应该工作:
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
因此,您将返回2天的数据。不是OP想要的。 –
不,它会将数据从当前时间返回到24小时制造者 –
但是数据类型是'Date'而不是'Datetime',所以它将包含昨天和今天。 2天。 –
如果您print_date
是datetime
字段,而不仅仅是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 today
和less than the start of tomorrow
您将获得一切。
如果您只需要一天的数据,则必须将范围的结束日期设置为与开始日期相同。 –
为什么甚至设置一个范围。只要有'i.print_date = @ sdate' –
我知道你在说什么,我试过这样做,但它什么都没有返回。我将该参数添加到报告中,以便我可以看到它是如何填充的,并将“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