SQL Server按日期排序

时间:2017-08-25 20:57:17

标签: sql sql-server tsql

我在SQL Server 2016中有一个事务表,其中有一列名为mthweekyr,其中此列中的每一行都包含字符串,月份编号,月份周数和事务年份,其中周数由月/日确定。

例如,如果交易日期为:2018-09-28,则会显示为9-4-2018

问题是原始事务日期列实际上不在表中,我想按mthweekyr列对这些事务进行排序,但由于此列不是日期类型,因此无法执行此操作,它是一种字符串类型。 (我不做桌子,我只是用它们!)

有关如何进行的任何建议?

感谢。

5 个答案:

答案 0 :(得分:3)

这是另一种方式......

declare @table table(mthweekyr varchar(10))
insert into @table
values
('9-4-2018'),
('8-4-2018'),
('9-5-2018'),
('7-5-2018'),
('7-4-2018'),
('9-5-2017'),
('9-4-2017')

select *
from @table
order by
    cast(right(mthweekyr,4) as int)                          --order by year first
    ,cast(left(mthweekyr,charindex('-',mthweekyr)-1) as int) --order by month. Works for single or double digit months
    ,left(right(mthweekyr,6),1)                              --order by week number which is always a single digit, since it's the week number of the month not the year.

答案 1 :(得分:3)

迟到的回答,但也许是一个更薄的选择。

您可以简单地使用m-d-y到日期的隐式转换

示例

declare @table table(mthweekyr varchar(10))
insert into @table
values
('9-4-2018'),
('8-4-2018'),
('9-5-2018'),
('7-5-2018'),
('7-4-2018'),
('9-5-2017'),
('9-4-2017'),
('10-4-2017'),  -- added 2 digit month
('10-5-2017')   -- added 2 digit month

Select *
 From  @table
 Order By convert(date,mthweekyr)

<强>返回

mthweekyr
9-4-2017
9-5-2017
10-4-2017
10-5-2017
7-4-2018
7-5-2018
8-4-2018
9-4-2018
9-5-2018

答案 2 :(得分:2)

使用JNevill的建议,你可以利用PARSENAME。

declare @Date varchar(20) = '9-4-2018'
select PARSENAME(replace(@Date, '-', '.'), 1) + '-' + right('00' + PARSENAME(replace(@Date, '-', '.'), 3), 2) + '-' + right('00' + PARSENAME(replace(@Date, '-', '.'), 2), 2)

返回2018-09-04

你也可以做一些字符串操作但开始变得相当乏味。

答案 3 :(得分:1)

显然不是最有效的我确定,但要强行它......

order by substring(@theStr, len(@theStr) - 4 + 1, 4)  
                + substring(@thestr,  charindex('-',@Thestr)+1,1)
                + right('00' + substring(@thestr, 1, charindex('-',@Thestr)-1),2)

这里是如何实现目标:

declare @thestr varchar(255) = '9-4-2018'

Declare @SortStr as Varchar(255)

--year
Select @SortStr = substring(@theStr, len(@theStr) - 4 + 1, 4) 
print @Sortstr
--day
Select @SortStr = right('00' + substring(@thestr, 1, charindex('-',@Thestr)-1),2)
print @sortStr

--week
Select @SortStr = substring(@thestr,  charindex('-',@Thestr)+1,1)
print @sortStr

Select @SortStr = substring(@theStr, len(@theStr) - 4 + 1, 4)  
                + substring(@thestr,  charindex('-',@Thestr)+1,1)
                + right('00' + substring(@thestr, 1, charindex('-',@Thestr)-1),2)

将产生此输出

2018
09
4
2018409

答案 4 :(得分:1)

由于您知道日期哈希的算法是什么,因此您可以将原始日期还原到新列中,然后对其进行排序。类似的东西:

SELECT *, CONVERT(datetime2(1), 
    RIGHT(@mthweekyr, 4) + '-' + 
    LEFT(@mthweekyr, CHARINDEX('-', @mthweekyr) - 1) + '-' + 
    SUBSTRING(@mthweekyr, CHARINDEX('-', @mthweekyr) + 1, 
        CHARINDEX('-', @mthweekyr, CHARINDEX('-', @mthweekyr) + 1)
            - CHARINDEX('-', @mthweekyr) - 1)) AS EstimatedDate
FROM theTable
ORDER BY EstimatedDate

更新

所以上面是漫长而艰难的方式。

更智能的方法是将繁重的工作留给SQL引擎并使用CONVERT function的第三个参数,它指定输入的样式。由于mthweekyr基本上代表美国风格的mm-d-yyyy,因此查询将如下所示:

    SELECT *, CONVERT(datetime2(1), mthweekyr, 110) AS EstimatedDate
    FROM theTable
    ORDER BY EstimateDate