拆分并从sqlserver表中选择特定值

拆分并从sqlserver表中选择特定值,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我在SQL server中有一个表项目,其中有一个字段StartDate,其值为 15-02-2013 15:02:40 20-08-2011 10:11:20 等 我需要从中检索不同的年份值,如 2013年和2011年仅限 我试过这样的问题 select (case when charindex(' ', StartDate) > 0 then left(StartDate, charindex(' ', (StartDate))-1)

我在SQL server中有一个表项目,其中有一个字段StartDate,其值为

15-02-2013 15:02:40
20-08-2011 10:11:20
等 我需要从中检索不同的年份值,如
2013年和2011年
仅限 我试过这样的问题

select (case when charindex(' ', StartDate) > 0
             then left(StartDate, charindex(' ', (StartDate))-1)
             else StartDate
        end) as StartDate FROM [kneipp].[dbo].[kn_projects]
其结果为2013年2月15日和2011年8月20日 和

获得
2013 15:02:40和2011 10:11:20


如何实现我的预期结果

您可以将该列转换为日期时间格式

SELECT YEAR(CAST(StartDate AS DATETIME)) FROM [kneipp].[dbo].[kn_projects]

你试过这样的表达吗

SELECT distinct year( convert(datetime,StartDate,105)) 
FROM [kneipp].[dbo].[kn_projects]

正如其他人指出的,您可以转换为datetime,如果您想保留数据类型,请尝试下面的查询

Declare @t varchar(50),@t1 varchar(50)
set @t='15-02-2013 15:02:40'

Select left(parsename(replace(@t,'-','.'),1),4)
如果有任何格式的datetime,请尝试下面的表达式,该表达式将以varchar数据类型返回年份

Select left(parsename(replace(@t1,'-','.'),1),
            charindex(' ',parsename(replace(@t1,'-','.'),1)))

StartDate列的类型是什么?它的类型是varchar…….varchar(50)它的格式是否总是像“dd-mm-yyy”?为什么不直接使用
子字符串(startdate,7,4)
呢?@JakubKania这是一个很好的解决方案。使用DISTINCT很好。谢谢:)我也想到了这一点,但担心在我的源代码中的许多地方会出现一些代码更改和中断,我理解,但是你会有一个非常复杂的语句,你可能应该在你的应用程序中这样做。或者在插入之前检查格式。我收到一个错误,如“将字符数据类型转换为日期时间数据类型导致日期时间值超出范围。”运行查询
Select left(parsename(replace(@t1,'-','.'),1),
            charindex(' ',parsename(replace(@t1,'-','.'),1)))