从子串T-SQL转换datetime

时间:2017-05-16 16:40:38

标签: sql-server tsql datetime type-conversion substring

我一直试图弄清楚如何转换返回2位数的选择结果,然后我想将其转换为年份,这样我就可以获取当年的max()值。

我的表:

ins_order
------------------------
RSN  |  ordered
---------------
1    |  A04-01
2    |  A12-02
3    |  A98-01
4    |  B00-10
2    |  B10-02
3    |  C97-01
4    |  C03-10

依旧......

我的选择状态如下:

select 
    max(substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2)) as year
from 
    ins.insorders
where 
    orderid is not null
group by 
    substring(orderid, 0, patindex('%[0-9]%', orderid))
order by 
    year

这将返回:

year
---------
98           
10
97

但是当我使用max时,它返回每个字母的最高编号,但在获得最高编号之前,我需要将这2个数字转换为年份格式,以便它可以理解17实际上是最高的,因为我们是在2017年。< / p>

1 个答案:

答案 0 :(得分:2)

正如Sean Lange在评论中所说,在尝试以有意义的方式使用它之前,您必须将substring()转换为有意义的值。

select 
    Ltr = substring(orderid, 0, patindex('%[0-9]%', orderid))
  , Year = max(case when convert(int,substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2)) < 50
  then convert(int,'20'+substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))
  else convert(int,'19'+substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))
  end)
from ins_orders
group by substring(orderid, 0, patindex('%[0-9]%', orderid))
order by year desc

rextester演示:http://rextester.com/ZRV37957

返回:

+-----+------+
| Ltr | Year |
+-----+------+
| A   | 2012 |
| B   | 2010 |
| C   | 2003 |
+-----+------+