按日期对sql中的项进行排序
我有带电影ID、电影名和电影日期的电影表。 我想先选择过去24小时内添加的所有电影,然后按日期排序,其余按newid排序 即 1巴比伦2010年9月28日16:00 2.12摩纳基2010年9月28日8:00 3.se7en 2010年9月25日5:00 4.抓举2010年9月26日18:00 我怎样才能做到呢 最终答案是所有其他答案的组合,所有这些答案都有好处按日期对sql中的项进行排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有带电影ID、电影名和电影日期的电影表。 我想先选择过去24小时内添加的所有电影,然后按日期排序,其余按newid排序 即 1巴比伦2010年9月28日16:00 2.12摩纳基2010年9月28日8:00 3.se7en 2010年9月25日5:00 4.抓举2010年9月26日18:00 我怎样才能做到呢 最终答案是所有其他答案的组合,所有这些答案都有好处 declare @date smalldatetime set @date = dateadd(dd,-2,getdate()) D
declare @date smalldatetime
set @date = dateadd(dd,-2,getdate())
DECLARE @d AS int
SET @d = DATEPART(ss, GETDATE()) + 3
select
movieID,
movieTitle,
movieDate
from Movies
order by
case
when movieDate>@date
then movieDate end desc, movieID % @d
尝试一些未经测试的方法:
SELECT
*
FROM (
SELECT -- start with the newest movies
movieID,
movieName,
movieDate,
1 AS rnk -- new will need it to sort them property
FROM
movies
WHERE
movieDate >= DATEADD(h, -24, GETDATE()) -- from last 24 hours
UNION ALL -- there will be no duplicates (so, so)
SELECT
movieID,
movieName,
movieDate,
2 AS rnk -- goes after the newest ones
FROM
movies
WHERE
movieDate < DATEADD(hh, -24, GETDATE()) -- older then 24 hours
) AS movies
ORDER BY
rnk,
CASE WHEN rnk = 1 THEN movieDate ELSE newid() END -- order by movieDate newest movies and by newid() older ones
然后在ORDER子句中使用movieID%@d代替newid。另一个用于测试
ORDER BY
CASE WHEN movieDate >= DATEADD(hour, -24, GETDATE()) THEN movieDate END DESC,
CHECKSUM(NEWID())
大概是这样的:
ORDER BY
CASE
WHEN [movieDate] BETWEEN DATEADD(d, -1, GETDATE()) AND GETDATE()
THEN [movieDate]
ELSE [movieID]
END DESC
试一试
谢谢,我将等待另一个答复,以评估我的数据集上每个查询的性能,这不会说哪个答案是错误的,但哪一个对我的数据集及其索引的性能更好。是的。我想展示所有的电影,第一部必须是新的,其余的随机排列。这是商品目录,我还没有检查你的查询,但通过阅读它有轻微的问题。它不会按添加日期对过去24小时内的新电影进行排序。如果我的主索引是movieID,它不能确保movieid5比movieid4+1更新smalldatetime变量,而不是每次都使用getdate。
ORDER BY
CASE
WHEN [movieDate] BETWEEN DATEADD(d, -1, GETDATE()) AND GETDATE()
THEN [movieDate]
ELSE [movieID]
END DESC
DECLARE @date AS datetime
SET @date = DateAdd(hh, -25, GetDate())
SELECT
*
FROM (
SELECT
movieID,
movieName,
movieData,
movieDate AS dateToOrder
FROM
movies
WHERE
movieDate >= DateAdd(h, -24, GetDate())
UNION ALL
SELECT
movieID,
movieName,
movieData,
@date AS dateToOrder
FROM
movies
WHERE
movieDate < DateAdd(hh, -24, GetDate()) -- older then 24 hours
) AS movies
ORDER BY dateToOrder DESC, movieID