How to use Order by MONTH name of data type CHAR/VARCHAR in SQL
I have seen this question "How to use Order by MONTH name of data type
CHAR/VARCHAR in SQL" in one of the forum. The reason why the programmer
required this option is he/she is storing Data, month
and year in 3 different fields in the database. Even
though I don't agree to store the dates split in three
different fields I thought I will explore how we can
get desired result sort by month that even a
varchar/Char datatype field.
If you are an SQL developer this is not a big task.
Let's check this with by creating a table.
CREATE TABLE [dbo].[Emp](
[ID]
[nchar](10) NULL,
[Name]
[nchar](10) NULL,
[Month]
[nchar](10) NULL
) ON [PRIMARY]
GO
Now we will insert few records in the table.
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (1,'Asheej','March')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (2,'Priyabrata','May')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (3,'Santosh','December')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (4,'Yathish','November')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (5,'Mayur','January')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (6,'Ryan','June')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (7,'Karolina','February')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (8,'Shyam','April')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (9,'Sumit','October')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (10,'Prathibha','August')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (11,'Sowmya','July')
INSERT
INTO [dbo].[Emp]([ID],[Name],[Month])VALUES (12,'Ashish','September')
GO
First we will see what will be the result if we run the simple select query order by Month.
SELECT * FROM [dbo].[Emp] order by [MONTH]
Out of the above query will be,
ID Name Month
8 Shyam April
10
Prathibha August
3 Santosh
December
7 Karolina February
5 Mayur January
11
Sowmya July
6 Ryan
June
1 Asheej March
2 Priyabrata May
4
Yathish November
9 Sumit
October
12 Ashish September
You can see the MONTH field order by alphebetically. So here comes the issue we want the data order by Month starting Jan, feb ..in the actual month order.
So to get that result we will write below query,
SELECT
* FROM [dbo].[Emp]
order by DATEPART(mm,CAST([MONTH]+ ' 1900' AS DATETIME)) asc
Now we will see the final output,
ID Name Month
5 Mayur January
7
Karolina February
1 Asheej
March
8 Shyam April
2 Priyabrata May
6
Ryan June
11 Sowmya
July
10 Prathibha August
12 Ashish September
9
Sumit October
4 Yathish
November
3 Santosh December
As usual you are always welcome to post your comment below.