2013-10-28 39 views
0
SELECT DISTINCT YEAR(convert(varchar(max),OrderCreatedDate)) from webshop 

上面的SQL查詢產生這樣的錯誤:轉換NVARCHAR到DATETIME並選擇不同的年份

Conversion failed when converting date and/or time from character string. 

在數據庫中的值是NVARCHAR和以下面的格式:DD/MM/YYYY 00: 00:00 AM(/ PM)

我想選擇一年中唯一的值!

感謝您的幫助

+1

爲什麼人們顯然不願意使用正確的'date [time]'數據類型? –

+0

爲什麼你不能有這樣的領域的時間戳? –

回答

2

爲避免此類問題,日期應保存在DateTime類型字段中不在字符串字段中。

Year()功能參數是DateTime type不是 a String。所以你應該確保你傳遞的字符串可以轉換爲DateTime類型。在這種情況下,您可以用Left() function修剪出時間部分,並使用103樣式,如下所示。

Fiddle demo:

--Example 
declare @val nvarchar(50) = '28/10/2013 11:25:45 AM (/PM)' 
select year(convert(date,left(@val,10),103)) myYear 

--Applying to your query 
SELECT DISTINCT Year(Convert(Date,Left(OrderCreatedDate,10),103)) FROM Webshop 

UPDATE: 如果您收到錯誤,它可能是由於你的日期格式。即您保存的字符串的格式可能不像您在問題中所描述的(DD/MM/YYYY 00:00:00 AM (/PM))。

在轉換爲日期之前,請檢查ISDATE()函數,並確定哪些記錄導致問題並予以糾正。

試試這個查詢來獲取所有的無效字符串。對於格式無效的值,以下查詢將返回0。

SELECT DISTINCT CASE WHEN IsDate(eft(OrderCreatedDate,10))=1 THEN 
         Year(Convert(Date,Left(OrderCreatedDate,10),103)) 
       ELSE 0 END as myDate, 
       OrderCreatedDate 
FROM Webshop 

或者你只能得到導致問題的記錄;

SELECT OrderCreatedDate 
FROM Webshop 
WHERE IsDate(Left(OrderCreatedDate,10)) = 0 
+0

感謝您的回覆和詳細信息!我試過查詢,並得到這個錯誤'轉換日期和/或時間從字符串轉換失敗。' – neeko

+0

再次感謝您的幫助! – neeko

+0

我的榮幸,很高興爲您提供幫助。 – Kaf

1
select distinct year(CONVERT(NVARCHAR(255),CONVERT(SMALLDATETIME, columnName,105))) 
+0

感謝您的回覆,我現在得到這個錯誤'將nvarchar數據類型轉換爲smalldatetime數據類型導致超出範圍值。任何想法? – neeko

1

試試這個

SELECT DISTINCT YEAR(Convert(datetime,OrderCreatedDate,103)) from webshop 

DD/MM/YYYY 00:00:00 AM (/PM)是英國的格式。請參見Convert

+0

但是,我確實想保留英國格式,感謝您的建議,但我得到此錯誤'nvarchar數據類型轉換爲日期時間數據類型導致超出範圍值。 – neeko

+0

此錯誤是可能是錯誤數據的結果。我想不是所有的數據都是正確的dd/mm/yyyy格式。 – unlimit