Sql 以字符串格式对周日期进行排序
我在一个表格中有两列数据,分别为Sql 以字符串格式对周日期进行排序,sql,sql-server,Sql,Sql Server,我在一个表格中有两列数据,分别为week和amount,如下所示 Week Amount -------------------------------- 1w - 1m - 2015 1000 4w - 8m - 2015 1000 2w - 2m - 2015 1000 4w - 6m - 2015 1000 3w - 3m - 2015
week
和amount
,如下所示
Week Amount
--------------------------------
1w - 1m - 2015 1000
4w - 8m - 2015 1000
2w - 2m - 2015 1000
4w - 6m - 2015 1000
3w - 3m - 2015 1000
3w - 10m - 2015 1000
1w - 10m - 2015 1000
3w - 12m - 2015 1000
1w - 6m - 2016 1000
2w - 6m - 2016 1000
3w - 6m - 2016 1000
4w - 6m - 2016 1000
3w - 8m - 2016 1000
2w - 9m - 2016 1000
我如何按周(按日期)对这张表进行排序
我期望的输出是:
Week Amount
--------------------------------
1w - 1m - 2015 1000
2w - 2m - 2015 1000
3w - 3m - 2015 1000
4w - 6m - 2015 1000
4w - 8m - 2015 1000
1w - 10m - 2015 1000
3w - 10m - 2015 1000
3w - 12m - 2015 1000
1w - 6m - 2016 1000
2w - 6m - 2016 1000
3w - 6m - 2016 1000
4w - 6m - 2016 1000
3w - 8m - 2016 1000
2w - 9m - 2016 1000
返回
week Amount
1w - 1m - 2015 1000
2w - 2m - 2015 1000
3w - 3m - 2015 1000
4w - 6m - 2015 1000
4w - 8m - 2015 1000
1w - 10m - 2015 1000
3w - 10m - 2015 1000
3w - 12m - 2015 1000
1w - 6m - 2016 1000
2w - 6m - 2016 1000
3w - 6m - 2016 1000
4w - 6m - 2016 1000
3w - 8m - 2016 1000
2w - 9m - 2016 1000
以公认的答案为基础,若可以更改表结构(添加一些列),则可以通过使用持久化计算列以更友好的方式存储数据。这会在数据插入上花费一些存储和额外的计算工作,但它会使大多数将来的选择更快,因为不再需要字符串解析。此外,每个列都有相应的类型,因此很难获取无效数据 设置:
create table WeekData
(
WeekStr VARCHAR(16) NOT NULL,
Amount INT,
YearVal AS CAST (Right(WeekStr,4) AS SMALLINT) PERSISTED,
MonthVal AS cast(substring(WeekStr,charIndex('m', WeekStr)-2,2) as SMALLINT),
WeekVal AS CAST(left(WeekStr,1) AS TINYINT)
)
insert into WeekData (WeekStr, Amount)
VALUES ('1w - 1m - 2015', 1000),
('4w - 8m - 2015', 1000),
('2w - 2m - 2015', 1000),
('4w - 6m - 2015', 1000),
('3w - 3m - 2015', 1000),
('3w - 10m - 2015', 1000),
('1w - 10m - 2015', 1000),
('3w - 12m - 2015', 1000),
('1w - 6m - 2016', 1000),
('2w - 6m - 2016', 1000),
('3w - 6m - 2016', 1000),
('4w - 6m - 2016', 1000),
('3w - 8m - 2016', 1000),
('2w - 9m - 2016', 1000)
GO
选择
select WeekStr, Amount
from WeekData
order by YearVal, MonthVal, WeekVal
数据是否与上述数据相同?请告诉我们“周”列的数据类型。@Dour High Arch数据类型为varchar@ShakeerMirza Yes数据与上述数据相同为什么不在表中包括周开始日期?
select WeekStr, Amount
from WeekData
order by YearVal, MonthVal, WeekVal