首页 > 解决方案 > 基于具有 varchar 类型的 DateTime 列优化分页和排序

问题描述

我希望在我的 Web 应用程序的排序解决方案中优化分页。为此,我在 SQL Server 2012 中使用了存储过程。

我使用以下 SQL 语句对CreatedTime保存订单日期和时间的列进行排序。

但是,该列的数据类型VARCHAR在数据库中。

我想将该列转换为datetime第一列,然后根据该列进行排序。除此之外,我还想根据Profit列进行排序,并且该列也保存为VARCHAR.

这是我到目前为止所做的:

DECLARE @SortColumn VARCHAR(20),
        @SortDirection VARCHAR(20)

SET @SortColumn = 'CreatedTime'
SET @SortDirection = ' DESC'

SELECT ROW_NUMBER() OVER
      (
            ORDER BY  
            concat (CONVERT(DateTime, CreatedTime,101), ' ' , @SortDirection)

             CASE 
                WHEN @SortColumn ='CreatedTime' THEN concat (CONVERT(DateTime, CreatedTime,101), ' ' , @SortDirection)

                WHEN @SortColumn = 'Profit' THEN concat (CONVERT(DECIMAL(16,2), Profit), ' ' , @SortDirection)
            END


     ) AS RowNumber
      ,OrderID
,CreatedTime
,Profit
From Orders

上述语句的结果不是按CreatedTime列排序的。

标签: sql-serversql-server-2012

解决方案


我认为问题在于连接CreatedTime列和@SortDirection变量,因此以下内容将有助于解决您的问题。

以下查询用作示例表和数据;

CREATE TABLE Orders (OrderID INT IDENTITY(1,1) ,CreatedTime VARCHAR(100),Profit VARCHAR(100) )
GO
INSERT INTO Orders VALUES('2020-02-19 12:10:57.083', '100.234')
INSERT INTO Orders VALUES('2020-02-17 12:11:17.973', '999.234')
INSERT INTO Orders VALUES('2020-02-25 12:11:48.277', '8892.234')

以下查询将根据变量对列值进行排序。

DECLARE @SortColumn VARCHAR(20),
        @SortDirection VARCHAR(20)

SET @SortColumn = 'CreatedTime'
SET @SortDirection = 'ASC'
IF @SortDirection= 'DESC'
BEGIN 
SELECT ROW_NUMBER() OVER
      (
            ORDER BY  
          --  concat (CONVERT(DateTime, CreatedTime,101), ' ' , @SortDirection)

             CASE 
                WHEN @SortColumn ='CreatedTime' THEN CONVERT(DateTime, CreatedTime,101)

            END 
            DESC
            ,
              CASE  WHEN @SortColumn = 'Profit' THEN CONVERT(DECIMAL(16,2), Profit)
            END  DESC


     ) AS RowNumber
      ,OrderID
,CreatedTime
,Profit
From Orders
END


IF @SortDirection= 'ASC'
BEGIN 
SELECT ROW_NUMBER() OVER
      (
            ORDER BY  
          --  concat (CONVERT(DateTime, CreatedTime,101), ' ' , @SortDirection)

             CASE 
                WHEN @SortColumn ='CreatedTime' THEN CONVERT(DateTime, CreatedTime,101)

            END 
            ASC
            ,
              CASE  WHEN @SortColumn = 'Profit' THEN CONVERT(DECIMAL(16,2), Profit)
            END  ASC


     ) AS RowNumber
      ,OrderID
,CreatedTime
,Profit
From Orders
END

推荐阅读