我在SQL Server 2016中有一个事务表,其中有一列名为mthweekyr
,其中此列中的每一行都包含字符串,月份编号,月份周数和事务年份,其中周数由月/日确定。
例如,如果交易日期为:2018-09-28
,则会显示为9-4-2018
。
问题是原始事务日期列实际上不在表中,我想按mthweekyr
列对这些事务进行排序,但由于此列不是日期类型,因此无法执行此操作,它是一种字符串类型。 (我不做桌子,我只是用它们!)
有关如何进行的任何建议?
感谢。
答案 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