2013-10-28 16 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