2017-01-20 86 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