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