将NVARCHAR转换为DATETIME并选择不同的Year

时间:2013-10-28 13:10:12

标签: sql sql-server

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)

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

感谢您的帮助

3 个答案:

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

<强>更新 如果您收到错误,可能是由于您的日期格式。即您保存的字符串的格式可能与问题中描述的(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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

试试这个

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

DD/MM/YYYY 00:00:00 AM (/PM)是英国格式。见Convert