爲避免此類問題,日期應保存在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
來源
2013-10-28 13:25:11
Kaf
爲什麼人們顯然不願意使用正確的'date [time]'數據類型? –
爲什麼你不能有這樣的領域的時間戳? –