2015-02-10 37 views
0

我不能爲我的生活得到這個工作。我已經嘗試了我在這裏和遍佈互聯網上看到的每一個例子。我試圖根據一個月的數據進行查詢。在我查詢視圖中的數據的格式如下:SQL Server:查詢條件 - 需要從日期時間提取日期

2012-03-20 00:00:00.000 

使用下列標準這勾起所有的日期(或幾乎所有的)。有任何想法嗎?

AND cast(convert(varchar(10), lag.postingdate, 112) as datetime) between '2015-01-01' and '2015-01-31' 

原始查詢:

SELECT 
    prov.pgrp_id AS PERFORMING_PROV_ID 
    , prov.pgrp_prov_name AS PERFORMING_PROV_NAME 
    , lag.chgno AS CHARGE_NUM 
    , lag/countcharges AS LAGTIME 
    , lag.chgamt 
    , lag.postingdate 
FROM 
    dbo.Providers prov 
RIGHT JOIN 
    dbo.LagTime_Charges_Calcs lag ON prov.pgrp_prov_cd = lag.provcode 
            AND prov.pgrp_practice = lag.px 
LEFT JOIN 
    dbo.PlaceofService_union_v pos ON lag.px = pos.px 
            AND lag.poscode = pos.poscode 
WHERE 
    pos.posid = '1' 
    OR pos.posid = '2' 
    AND prov.Laginclude = 'y' 
    AND MONTH(lag.postingdate) = 1 
    AND YEAR(lag.postingdate) = 2015 

    --and lag.postingdate between '2015-01-01 00:00:00.000' and '2015-01-31 23:59:59.000' 
    --AND cast(convert(varchar(10),lag.postingdate,112) as datetime) between '2015-  01-01' and '2015-01-31' 
+1

你爲什麼要轉換爲字符串?試試'WHERE lag.postingdate> ='20150101'AND lag.postingdate <'20150201';'。請閱讀[本文](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx)和[本文] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)。 – 2015-02-10 20:51:08

+0

另外,停止談論「格式」 - 什麼是實際的*數據類型*?該視圖是否呈現該輸出,因爲它出於某種原因將日期/時間值格式化爲字符串?如果是這樣,停止這樣做... – 2015-02-10 20:58:01

+0

上面的例子不適合我。此列的數據類型是(datetime,null) – gfuller40 2015-02-10 21:02:25

回答

0

試試這個:

declare 
    @period_start datetime , 
    @period_end datetime 

set @period_start = '2015-01-01 00:00:00.000' 
set @period_end = dateadd(month,1,@period_start) 

select * 
from foo 
where foo.myDateTimeColumn >= @period_start 
    and foo.myDateTimeColumn < @period_end 
+0

消息139,級別15,狀態1,行0 無法將默認值分配給本地變量。 消息139,級別15,狀態1,行0 無法將默認值分配給本地變量。 Msg 137,Level 15,State 2,Line 16 必須聲明標量變量「@periods_start」 – gfuller40 2015-02-10 21:06:08

+0

@ gfuller40聽起來像您正在使用SQL Server 2005,而不是SQL Server 2008,就像您的問題被標記了一樣。 – 2015-02-10 21:08:40

+0

哦,廢話你是對的(9.0.5000)我的壞..我從來沒有在這臺服務器上,我們所有的其他人都是2008年。 – gfuller40 2015-02-10 21:12:49

0

好方法(將使用postingdate列索引)

where lag.postingdate >= '20150101' 
and lag.postingdate < '20150201' 

容易,但低效的方式(不會使用任何索引,即使有在這個日期列)

where MONTH(lag.postingdate) = 1 
and YEAR(lag.postingdate) = 2015 
+0

感謝您的回覆,但這兩個例子似乎都不起作用,我仍然得到了2008年的所有日期。他們沒有時間值,只是佔位符:2008-01-24 00:00:00.000 – gfuller40 2015-02-10 20:54:52

+0

@ gfuller40發佈您寫下的查詢。 – 2015-02-10 20:55:54

-1

爲什麼你不跳過所有的鑄造?

和「2015年1月1日00:00:00」和「23:59:59 2015年1月31日」

注加時之間lag.postingdate做出的包容性條件開始和結束的日期 - 開始並不重要,但是結果在1月31日之前除了第一秒之外將會錯過任何事情。

+0

您的查詢仍然可能會遺漏數據。見http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx – 2015-02-10 20:58:38

+0

我也試過這個,仍然沒有去..這是否與這是一個觀點的事實有關? – gfuller40 2015-02-10 21:06:49

0

的真正原因你獲得額外的結果要回到2008年了,因爲查詢的書面被包括posid =「1」不管帳日期的一切。

你需要將你的邏輯與的條件用括號:

WHERE (pos.posid='1' OR pos.posid ='2') and prov.Laginclude ='y' 
and MONTH(lag.postingdate) = 1 and YEAR(lag.postingdate) = 2015 

如果使用pos.posid IN ('1', '2')可以避開括號問題爲好。