2016-07-14 63 views
0

enter image description here我正在創建兩個值的查詢,一個週期號和相應的日期。期間是與我們的月份相似但不相同的會計期間。日期大體上是正確的,但是我認爲我會用WHERE語句清理一些不一致的地方。WHERE子句中的SQL-Server日期時間問題

例如,日期2015年4月1日所屬期3,但在這兩個週期3和週期4顯示了爲了解決這個問題,我想我會創建一個WHERE語句中指出:

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> 4 AND table1.datetime <> '4/1/2015' 

這帶走了所有的4期而不是我需要的。我也嘗試了日期時間語法:

AND table1.datetime <> '20150401 00:00:00.000' 

兩種語法都有相同的結果。我在SQL方面相當缺乏經驗,並一直討厭處理日期時間值,所以任何幫助都會很棒。

-EDIT-忘記將單引號添加到第一個datetime WHERE子句中。

+0

這是table1.datetime的類型? –

+0

@alex它是一個日期時間數據類型,而period是一個字符串。 – GHINOTE

+1

它有日期的時間值嗎?比較日期字符串時,您可能需要將日期轉換爲日期。如'2015年4月1日01:00:00.000'不等於'2015年4月1日',但CAST('4/1/2015 01:00:00.000'AS DATE)。 – BinaryPatrick

回答

1

嘗試以下操作:

SELECT DISTINCT table1.period, 
      table1.datetime 
FROM table1 
WHERE CASE WHEN table1.period = 4 AND CONVERT(VARCHAR(8),table1.datetime,112) = '20150401' THEN 1 ELSE 0 END = 0 

這隻擺脫行既具有period=4datetime=20150401的,而你的查詢首先擺脫任何有period=4 (不管[datetime]是什麼),那麼擺脫任何事情都有datetime=20150401

+0

當您使用OR時,Case語句只會改變輸出。 AND條件的評估結果相同。讓他們同時有一個AND語句意味着他們都必須是真的留在集合中 – BinaryPatrick

+0

這是有效的。對不起,但我還不能滿足。 – GHINOTE

0

你說那段時間是字符串字段嗎?你的意思是一個varchar?
此外,你只想檢查日期部分,而不是時間?

,那麼你可以試試這個

SELECT DISTINCT table1.period, 
       table1.datetime 
FROM table1 
WHERE table1.period <> '4' 
AND convert(date, table1.datetime) <> '20150401' 
+0

這可以在保留所有其他第4期日期的同時擺脫第4期(2015年4月1日),但也可以擺脫正確日期的第3期(4/1/2015)。 – GHINOTE

+0

確定它不是很清楚我想要什麼 – GuidoG