sql-server - 基于具有 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
列排序的。
解决方案
我认为问题在于连接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
推荐阅读
- file-upload - Yii2上传视频文件返回错误400
- node.js - Dialogflow 实现 webhook url 支持自签名证书吗?
- frama-c - 无法证明frama-c中的欧几里得除法
- amazon-web-services - AWS 子域指向子域
- javascript - 使画布在大于窗口大小的尺寸上可滚动
- c++ - 无法使用来自 bazel 的 boost/iostream 构建项目包
- php - 在多语言网站中生成链接
- compression - 压缩现有邮件文件,在 Roundcube (dovecot, centos) 中可读
- javascript - React Native 中的 React 导航图标
- spring - 具有自动配置的属性不适用于 Spring Cloud Stream 和 rabbitmq