用于按升序对MMM-YYYY文本数据排序的SQL查询

用于按升序对MMM-YYYY文本数据排序的SQL查询,sql,sql-server,Sql,Sql Server,表定义: CREATE TABLE [dbo].[Test] ( [MonthYear] [NVARCHAR](8) NULL ) ON [PRIMARY] 当前数据: 预期结果: 我尝试了以下查询: SELECT MonthYear, CONVERT(VARCHAR(9), '01-' + MonthYear, 106) AS ConvertedDate FROM dbo.Test ORDER BY ConvertedDate 此查询的结

表定义:

CREATE TABLE [dbo].[Test]
(
    [MonthYear] [NVARCHAR](8) NULL
) ON [PRIMARY]
当前数据:

预期结果:

我尝试了以下查询:

SELECT 
    MonthYear, 
    CONVERT(VARCHAR(9), '01-' + MonthYear, 106) AS ConvertedDate 
FROM 
    dbo.Test
ORDER BY
    ConvertedDate
此查询的结果:

SELECT 
    MonthYear, 
    CONVERT(VARCHAR(9), '01-' + MonthYear, 106) AS ConvertedDate 
FROM 
    dbo.Test
ORDER BY
    ConvertedDate
使用
按转换顺序(nvarchar,[MonthYear],101)

输出 一月十九日 5月19日使用
按转换顺序(nvarchar,[MonthYear],101)

输出 一月十九日
5月19日

CAST
日期的字符串值将起作用

SELECT MonthYear, CAST(CONVERT(VARCHAR(9), '01-' + MonthYear ,106) AS DATE) AS ConvertedDate 
FROM dbo.Test
ORDER BY ConvertedDate
使用示例数据执行示例:

DECLARE @TestData TABLE (MonthYear VARCHAR (10));

INSERT INTO @TestData (MonthYear) VALUES
('May-19'), ('Jan-19'), ('Jun-19'), ('Feb-19');

SELECT MonthYear, CAST(CONVERT(VARCHAR(9), '01-' + MonthYear ,106) AS DATE) AS ConvertedDate 
FROM @TestData
ORDER BY ConvertedDate

CAST
将字符串值转换为
DATE
将起作用

SELECT MonthYear, CAST(CONVERT(VARCHAR(9), '01-' + MonthYear ,106) AS DATE) AS ConvertedDate 
FROM dbo.Test
ORDER BY ConvertedDate
使用示例数据执行示例:

DECLARE @TestData TABLE (MonthYear VARCHAR (10));

INSERT INTO @TestData (MonthYear) VALUES
('May-19'), ('Jan-19'), ('Jun-19'), ('Feb-19');

SELECT MonthYear, CAST(CONVERT(VARCHAR(9), '01-' + MonthYear ,106) AS DATE) AS ConvertedDate 
FROM @TestData
ORDER BY ConvertedDate
你似乎想要:

SELECT MonthYear,
       CONVERT(DATE, '01-' + MonthYear) as ConvertedDate
FROM dbo.Test
ORDER BY ConvertedDate;
SQL Server非常擅长将字符串转换为无格式的日期

注意:您不需要在
选择中包含转换,因此:

SELECT MonthYear
FROM dbo.Test
ORDER BY CONVERT(DATE, '01-' + MonthYear);
或者,您甚至可以将其添加到表中:

ALTER TABLE Test
    ADD MonthYear_date as (CONVERT(DATE, '01-' + MonthYear));
然后,您可以像使用表中的任何其他列一样使用
MonthYear\u date

您似乎想要:

SELECT MonthYear,
       CONVERT(DATE, '01-' + MonthYear) as ConvertedDate
FROM dbo.Test
ORDER BY ConvertedDate;
SQL Server非常擅长将字符串转换为无格式的日期

注意:您不需要在
选择中包含转换,因此:

SELECT MonthYear
FROM dbo.Test
ORDER BY CONVERT(DATE, '01-' + MonthYear);
或者,您甚至可以将其添加到表中:

ALTER TABLE Test
    ADD MonthYear_date as (CONVERT(DATE, '01-' + MonthYear));


然后可以像使用表中的任何其他列一样使用
MonthYear\u date

MySQL SQL Server。你到底在用什么?我怀疑是后者,因为您引用的是
dbo
schema。Microsoft SQL Server要回答您的问题,数据是正确的<代码>'F'
'J'因此
'Feb'
'Jan'
之前。将日期存储/视为
日期
,问题就会消失。这只是选择正确的数据类型如此重要的一个原因。这是我的最后一个选择,但我只想知道是否可以将其转换为查询中的标准日期。2019年5月应转换为2019-05-01MySQL SQL Server。你到底在用什么?我怀疑是后者,因为您引用的是
dbo
schema。Microsoft SQL Server要回答您的问题,数据是正确的<代码>'F''J'因此
'Feb'
'Jan'
之前。将日期存储/视为
日期
,问题就会消失。这只是选择正确的数据类型如此重要的一个原因。这是我的最后一个选择,但我只想知道是否可以将其转换为查询中的标准日期。2019年5月应转换为2019年5月01日这也检索了与我的查询相同的未排序结果将
varchar
转换为
nvarchar
不会改变这里的任何内容。您拥有的样式代码是将日期/时间数据类型转换为字符串数据类型时使用的,反之亦然;不适用于从一种字符串类型转换为另一种字符串类型。此外,您应该养成为数据类型声明长度、比例、精度等的习惯。不这样做可能(也将)最终导致一些意外和不必要的行为。这也会检索相同的未排序结果,如我的查询将
varchar
转换为
nvarchar
不会改变这里的任何内容。您拥有的样式代码是将日期/时间数据类型转换为字符串数据类型时使用的,反之亦然;不适用于从一种字符串类型转换为另一种字符串类型。此外,您应该养成为数据类型声明长度、比例、精度等的习惯。如果不这样做,可能(也将)最终导致一些意外和不想要的行为。将该计算列设置为一个
持久化
列,OP可以获得所有好处;包括将其添加到其索引中。:)嗯。关于将其添加为计算列。。。如果在MonthYear列中输入一个“无效”值,似乎会出现严重错误。。。插入查询将成功。选择查询将失败。所以就我个人而言,我不会那样做@BartHofland您可以使用
TRY\u CONVERT
。@Larnu是的,如果我使用这样的构造,我肯定会使用像TRY\u CONVERT这样的故障保护机制。@BartHofland。使用错误值失败可能是使用计算列的一个好处。唉,这只在使用列时出现(除非它被持久化)。OP无论如何都应该包含一个检查约束,以保证列的格式。将该计算列设置为
持久化的
列,OP就可以获得所有好处;包括将其添加到其索引中。:)嗯。关于将其添加为计算列。。。如果在MonthYear列中输入一个“无效”值,似乎会出现严重错误。。。插入查询将成功。选择查询将失败。所以就我个人而言,我不会那样做@BartHofland您可以使用
TRY\u CONVERT
。@Larnu是的,如果我使用这样的构造,我肯定会使用像TRY\u CONVERT这样的故障保护机制。@BartHofland。使用错误值失败可能是使用计算列的一个好处。唉,这只在使用列时出现(除非它被持久化)。OP应该包含一个检查约束,以保证列的格式。您的逻辑是错误的。将varchar转换为style=106的varchar,然后转换为date。你的逻辑是错误的。将varchar转换为style=106的varchar,然后转换为date。它是偶然工作的。