Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按日期对sql中的项进行排序_Sql_Sql Server_Tsql - Fatal编程技术网

按日期对sql中的项进行排序

按日期对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

我有带电影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())

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