试一试用下面的order子句: order by convert(datetime,replace(replace(replace(日期,N'年','/'),N'月','/'),N'日',''))不过说实在的,日期使用varchar类型是在属于设计上的错误。不仅排序,计算起来麻烦,增加不必要的代码。而且还要增加代码验证用户输入的有效性,如果用户输入一个“2005年2月31日”那不就糗了。
我很不明白为什么日期会varchar难道前台日期是用户手输入的吗?这是何必呢 SQL Server 啊 努力 奋斗-----------------------------------------------------
create table t(date varchar(1000)) insert t select '2005年10月10日' union all select '2005年1月1日' union all select '2005年1月2日' union all select '2005年1月3日' go ---创建函数 create function f1(@col varchar(1000)) returns varchar(1000) as begin declare @str varchar(1000) declare @y varchar(1000) declare @m varchar(1000) declare @d varchar(1000) set @str='' set @y=left(@col,4) set @m=left(stuff(@col,1,5,''),charindex('月',stuff(@col,1,5,''))-1) set @d=left(stuff(stuff(@col,1,5,''),1,charindex('月',stuff(@col,1,5,'')),''),charindex('日',stuff(stuff(@col,1,5,''),1,charindex('月',stuff(@col,1,5,'')),''))-1) select @str=@str+@y+@m+@d return @str end go select date from t order by convert(int,dbo.f1(date)) --删除测试 drop table t drop function f1 ---结果 /* date ----- 2005年1月1日 2005年1月2日 2005年1月3日 2005年10月10日 */
order by cast(replace(replace(replace('2005年1月1日','年','/'),'月','/'),'日','') as smalldatetime)日期最好是存为日期类型或整型,
order by convert(datetime,replace(replace(replace(日期,N'年','/'),N'月','/'),N'日',''))不过说实在的,日期使用varchar类型是在属于设计上的错误。不仅排序,计算起来麻烦,增加不必要的代码。而且还要增加代码验证用户输入的有效性,如果用户输入一个“2005年2月31日”那不就糗了。
你们说的日期输入没事,表里存的是20050101这个字符串,
我查询的是建的临时表里的日期!
insert t
select '2005年10月10日' union all
select '2005年1月1日' union all
select '2005年1月2日' union all
select '2005年1月3日'
go
---创建函数
create function f1(@col varchar(1000))
returns varchar(1000)
as
begin
declare @str varchar(1000)
declare @y varchar(1000)
declare @m varchar(1000)
declare @d varchar(1000)
set @str=''
set @y=left(@col,4)
set @m=left(stuff(@col,1,5,''),charindex('月',stuff(@col,1,5,''))-1)
set @d=left(stuff(stuff(@col,1,5,''),1,charindex('月',stuff(@col,1,5,'')),''),charindex('日',stuff(stuff(@col,1,5,''),1,charindex('月',stuff(@col,1,5,'')),''))-1)
select @str=@str+@y+@m+@d
return @str
end
go
select date from t order by convert(int,dbo.f1(date))
--删除测试
drop table t
drop function f1
---结果
/*
date
-----
2005年1月1日
2005年1月2日
2005年1月3日
2005年10月10日
*/