为避免此类问题,日期应保存在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]'数据类型? –
为什么你不能有这样的领域的时间戳? –