2016-05-03 57 views
0

我想要使用下面的SQL語句,但一旦發生查詢我得到轉換日期時間從字符串轉換失敗。'錯誤消息。轉換datetime從字符串轉換失敗where子句

我已經嘗試轉換財政期間以及日期在where子句有效的日期時間,但只要我使用篩選日期時間查詢失敗。

如果我在臨時表中存儲相同的結果,然後在臨時表上使用日期過濾器,那麼我會得到預期的結果。

你可以請檢查下面的查詢錯誤嗎?

WITH TEMP_LEDGERPERIOD (DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD) 
AS 
(
    SELECT dataareaid, PERIODSTART, PERIODEND, CONVERT(DATETIME, '01-' + COMMENTARIES) AS FiscalPeriod 
    FROM LEDGERPERIOD LPT WITH (NOLOCK) 
    WHERE (COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE') 
) 

Select * 
from TEMP_LEDGERPERIOD 
where FiscalPeriod BETWEEN '2016/01/01' AND '2016/02/01' 
+0

「評論」是什麼樣的? –

+0

在WHERE子句或CONVERT函數上出錯?註釋掉WHERE子句,看看是否仍然出現錯誤。 – FLICKER

回答

1

使用日期時,您應該使用ISO標準日期格式或明確轉換。我不知道什麼COMMENTARIES看起來像,但在日期開始時的「01-」似乎是不太可能的格式。

此外,SQL Server不保證表達式的評估順序,除非您使用CASE。所以,WHERE條款中的過濾可能發生在之後的新值的計算。幸運的是,SQL Server 2012+提供TRY_CONVERT()

如果我假設的COMMENTARIES格式爲「YYYY-MM」,那麼你可以去:

WITH TEMP_LEDGERPERIOD (DATAAREAID, PERIODSTART, PERIODEND, FISCALPERIOD) AS (
     SELECT dataareaid, PERIODSTART, PERIODEND, 
      TRY_CONVERT(DATETIME, COMMENTARIES + '-01') AS FiscalPeriod 
     FROM LEDGERPERIOD LPT WITH (NOLOCK) 
     WHERE COMMENTARIES NOT LIKE '%OPEN' and COMMENTARIES NOT LIKE '%CLOSE' 
    ) 
Select * 
from TEMP_LEDGERPERIOD 
where FiscalPeriod BETWEEN '2016-01-01' AND '2016-02-01'; 

最後,你是否意識到BETWEEN是包容的,所以這包括二月的第一天。

+0

我可以想到的一種格​​式是將''01 -''預先設置爲像'JAN-16'這樣的'MMM-YY'。承認可能有更安全的轉換方式,但它應該可以工作, –

相關問題