0
SELECT DISTINCT YEAR(convert(varchar(max),OrderCreatedDate)) from webshop 

上面的 sql 查询产生了这个错误:

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

数据库中的值为 NVARCHAR,格式如下:DD/MM/YYYY 00:00:00 AM (/PM)

我只想选择一年的唯一值!

谢谢你的帮助

4

3 回答 3

3

为避免此类问题,日期应保存在 DateTime 类型字段中而不是字符串字段中。

Year()函数参数是 aDateTime type 不是a String。因此,您应该确保您传递的字符串可转换为 DateTime 类型。在这种情况下,您可以使用以下样式修剪时间部分Left() function并使用103 样式

小提琴演示:

--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 

更新: 如果您遇到错误,可能是由于您的日期格式。即您保存的字符串的格式可能与您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-28T13:25:11.040 回答
1
select distinct year(CONVERT(NVARCHAR(255),CONVERT(SMALLDATETIME, columnName,105)))
于 2013-10-28T13:13:18.600 回答
1

尝试这个

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

DD/MM/YYYY 00:00:00 AM (/PM)是英式格式。请参阅转换

于 2013-10-28T13:14:51.640 回答