sql-server - ROW_NUMBER - 从字符串转换日期和/或时间时转换失败
问题描述
这是我的表架构
CREATE TABLE [dbo].[MYTBL](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Designation] [nvarchar](250) NULL,
[LastModifiedDate] [datetime] NULL,
[Score] [INT] NULL,
[CreatedDate] [datetime] NOT NULL
CONSTRAINT [PK_OP_ProspectTBL] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO MYTBL VALUES ('a', GETUTCDATE(), 1, GETUTCDATE());
INSERT INTO MYTBL VALUES ('O', GETUTCDATE(), 112, GETUTCDATE());
INSERT INTO MYTBL VALUES ('Ob', GETUTCDATE(), 12, GETUTCDATE());
select * from MYTBL;
询问
DECLARE @IN_ORDERBY_COL int = 3,
@IN_ORDERBY_DIRECTION int = 1,
@IN_PAGENEXT int = 50,
@IN_PAGESKIP int = 0;
SELECT ROW_NUMBER() OVER(ORDER BY
(CASE WHEN @IN_ORDERBY_DIRECTION = 1 THEN
(
CASE
WHEN @IN_ORDERBY_COL = 1 THEN P.CreatedDate
WHEN @IN_ORDERBY_COL = 2 THEN P.LastModifiedDate
WHEN @IN_ORDERBY_COL = 3 THEN P.Designation
WHEN @IN_ORDERBY_COL = 4 THEN P.Score
END
)
END) ASC,
(CASE WHEN @IN_ORDERBY_DIRECTION = 2 THEN
(
CASE
WHEN @IN_ORDERBY_COL = 1 THEN P.CreatedDate
WHEN @IN_ORDERBY_COL = 2 THEN P.LastModifiedDate
WHEN @IN_ORDERBY_COL = 3 THEN P.Designation
WHEN @IN_ORDERBY_COL = 4 THEN P.Score
END
)
END) DESC
) AS [row_num],
COUNT(*) OVER () AS [total_rows],
*
FROM [dbo].[MYTBL] P WITH(NOLOCK)
ORDER BY row_num OFFSET @IN_PAGESKIP ROWS FETCH NEXT @IN_PAGENEXT ROWS ONLY;
上面的查询是一个存储过程,我正在尝试基于 Column 进行排序。
问题在于 Sort 中的所有列(2 个是DATETIME
type ,另一个是NVARCHAR(10)
)
当我尝试按公司订购时,出现以下错误
从字符串转换日期和/或时间时转换失败。
解决方案
好吧,将日期转换为字符串:
DECLARE @IN_ORDERBY_COL int = 3,
@IN_ORDERBY_DIRECTION int = 1,
@IN_PAGENEXT int = 50,
@IN_PAGESKIP int = 0;
SELECT ROW_NUMBER() OVER(ORDER BY
(CASE WHEN @IN_ORDERBY_DIRECTION = 1 THEN
(
CASE
WHEN @IN_ORDERBY_COL = 1 THEN CONVErT(VARCHAR(32), P.CreatedDate, 121)
WHEN @IN_ORDERBY_COL = 2 THEN CONVErT(VARCHAR(32),P.LastModifiedDate, 121)
WHEN @IN_ORDERBY_COL = 3 THEN P.Designation
END
)
END) ASC,
(CASE WHEN @IN_ORDERBY_DIRECTION = 2 THEN
(
CASE
WHEN @IN_ORDERBY_COL = 1 THEN CONVErT(VARCHAR(32),P.CreatedDate, 121)
WHEN @IN_ORDERBY_COL = 2 THEN CONVErT(VARCHAR(32),P.LastModifiedDate, 121)
WHEN @IN_ORDERBY_COL = 3 THEN P.Designation
END
)
END) DESC
) AS [row_num],
COUNT(*) OVER () AS [total_rows],
*
FROM [dbo].[MYTBL] P WITH(NOLOCK)
ORDER BY row_num OFFSET @IN_PAGESKIP ROWS FETCH NEXT @IN_PAGENEXT ROWS ONLY
;
推荐阅读
- c# - ASP.NET Core Controller 返回的 ViewResult 消耗在哪里?
- angular - 在导航之前,您可以获取初始导航的 url(和参数)吗?
- c++ - 当 GLEW 库 (C++) 中有任何函数时,程序不会运行
- python - 熊猫数据框到没有循环的numpy数组
- node.js - React 代理如何防止来自外界
- node.js - 无法在 Angular 项目中导入 socket.io-client
- r - 从另一个列表中索引列表元素
- pytorch - Tensorboard 在训练期间无法绘制所有时期的模型权重
- sql - 使用 JOIN 显示 MAX 记录
- amazon-web-services - 多区域访问 AWS CLI