Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 以字符串格式对周日期进行排序_Sql_Sql Server - Fatal编程技术网

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