根据日期排序的问题?大家帮忙一下!

ajoy 2014-02-21 10:23:01
有一个表,5条数据:名称字段:name
值为: A B C D E 按顺序排列显示的。

我想达到这样的目的:

今天的排序顺序是: A B C D E 明天的排序顺序是 B C D E A 后天的排序: C D E A B 如此循环

不知道如何实现。
...全文
317 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-02-22
  • 打赏
  • 举报
回复
引用 14 楼 ajoy 的回复:
我想用一条语句,或则 用存储过程 来做,不用临时表 可以吗?
没有那么理想的事情,毕竟T-SQL没有提供直接的函数,11楼的with、其他用临时表的方式,都是为了得到最终结果,你可以认为它本来也不是临时表,如果存储过程,里面是怎么实现的,根本没所谓,只要能实现你的要求即可
t101lian 2014-02-21
  • 打赏
  • 举报
回复
少了一个字母,

if object_id('tempdb..#a') is not null drop table #a
go
CREATE TABLE #a(name varchar(5));
insert into #a 
select 'A' UNION ALL 
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' UNION ALL 
SELECT 'E'   
--今天21号 ,datepart(dd,getdate())%5 取得值正好是1,
-- datepart(dd,getdate())%5+1就是显示你明天要的结果,
--或者把getdate() 改成'2014-2-22'测试明天的
;with cte as(
select *,row_number() over (order by getdate()) as m ,
datepart(dd,getdate())%5 as short from #a
)  
select name from cte
order by  case when short=m then 0 when m>short then 1 else 2 end ,m
t101lian 2014-02-21
  • 打赏
  • 举报
回复
引用 6 楼 ajoy 的回复:
4楼的方法明白一些,但是调试不出来,总是提示 列名short 无效!
我执行过,没问题的呀, 你再试试,
f object_id('tempdb..#a') is not null drop table #a
go
CREATE TABLE #a(name varchar(5));
insert into #a 
select 'A' UNION ALL 
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' UNION ALL 
SELECT 'E'   
--今天21号 ,datepart(dd,getdate())%5 取得值正好是1,
-- datepart(dd,getdate())%5+1就是显示你明天要的结果,
--或者把getdate() 改成'2014-2-22'测试明天的
;with cte as(
select *,row_number() over (order by getdate()) as m ,
datepart(dd,getdate())%5 as short from #a
)  
select name from cte
order by  case when short=m then 0 when m>short then 1 else 2 end ,m
  • 打赏
  • 举报
回复
引用 7 楼 chwnrthd 的回复:

create table test(rn int,name char)
insert into test values(1,'A')
insert into test values(2,'B')
insert into test values(3,'C')
insert into test values(4,'D')
insert into test values(5,'E')

DECLARE @第一个日期 datetime
set @第一个日期='2014-02-18'
while  CONVERT(varchar(100),GETDATE(), 23)>@第一个日期
begin
	update test set rn=rn-1 
	update test set rn=(select MAX(rn) from test)+1 where rn=0
	set @第一个日期=DATEADD(DAY,1,@第一个日期)
end 
select * from test order by rn

/*
第一个日期以 2-18 为A开头开始 2-19 B开头 2-20C开头 以此类推  GETDATE()为需要查询日期  
*/
ajoy 2014-02-21
  • 打赏
  • 举报
回复
而且我已经建好了 a 这个表了,里面的字段 name 和 m 字段我都按照你的要求建好了。如下: 表a name m A 1 B 2 C 3 D 4 E 5
  • 打赏
  • 举报
回复

create table test(rn int,name char)
insert into test values(1,'A')
insert into test values(2,'B')
insert into test values(3,'C')
insert into test values(4,'D')
insert into test values(5,'E')

DECLARE @第一个日期 datetime
set @第一个日期='2014-02-18'
while  CONVERT(varchar(100),GETDATE(), 23)>@第一个日期
begin
	update test set rn=rn-1 
	update test set rn=(select MAX(rn) from test)+1 where rn=0
	set @第一个日期=DATEADD(DAY,1,@第一个日期)
end 
select * from test order by rn
ajoy 2014-02-21
  • 打赏
  • 举报
回复
4楼的方法明白一些,但是调试不出来,总是提示 列名short 无效!
  • 打赏
  • 举报
回复
引用 3 楼 ajoy 的回复:
就是想 按顺序排序,轮流,不想固定排序。
那就这样,不是循环,是随机的排序: select * from t order by checksum(newid())
t101lian 2014-02-21
  • 打赏
  • 举报
回复

if object_id('tempdb..#a') is not null drop table #a
go
CREATE TABLE #a(name varchar(5));
insert into #a 
select 'A' UNION ALL 
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' UNION ALL 
SELECT 'E'   
--今天21号 ,datepart(dd,getdate())%5 取得值正好是1,
-- datepart(dd,getdate())%5+1就是显示你明天要的结果,
--或者把getdate() 改成'2014-2-22'测试明天的
;with cte as(
select *,row_number() over (order by getdate()) as m ,
datepart(dd,getdate())%5 as short
from #a
)  
select name from cte
order by  case when short=m then 0 when m>short then 1 else 2 end ,m

 /*
name
-----
A
B
C
D
E

*/
ajoy 2014-02-21
  • 打赏
  • 举报
回复
就是想 按顺序排序,轮流,不想固定排序。
  • 打赏
  • 举报
回复
这个需要定义具体的规则不
Yole 2014-02-21
  • 打赏
  • 举报
回复
能具体说下您这么做的目的是为了做啥么??
ajoy 2014-02-21
  • 打赏
  • 举报
回复
我想用一条语句,或则 用存储过程 来做,不用临时表 可以吗?
ajoy 2014-02-21
  • 打赏
  • 举报
回复
9楼的方法,只能变3天,3天之后,顺序就不变了!
ajoy 2014-02-21
  • 打赏
  • 举报
回复
你这是创建一个临时表来查询,我已经有这个表了,如何用 语句来查询呢?我需要在页面中显示出来查询结果。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧