仅在sql

时间:2016-05-06 08:56:01

标签: oracle oracle11g oracle-sqldeveloper

我有一个像这样的SQL Server表

+----+-----------+------------+
| id |  acoount  |    date    |
+----+-----------+------------+
|    |  John     |  2/6/2016  | 
|    |  John     |  2/6/2016  | 
|    |  John     |  4/6/2016  | 
|    |  John     |  4/6/2016  | 
|    |  Andi     |  5/6/2016  | 
|    |  Steve    |  4/6/2016  | 
+----+-----------+------------+

我希望像这样插入id coloumn。

+-----------+-----------+------------+
|    id     |  acoount  |    date    |
+-----------+-----------+------------+
| 020616001 |  John     |  2/6/2016  | 
| 020616002 |  John     |  2/6/2016  | 
| 040616001 |  John     |  4/6/2016  | 
| 040616002 |  John     |  4/6/2016  | 
| 050616001 |  Andi     |  5/6/2016  | 
| 040616003 |  Steve    |  4/6/2016  | 
+-----------+-----------+------------+

我想生成像这样提供的日期的ID号。 02 + 06 + 16(自日期起)+001 = 020616001.如果日期相同,则为id + 1。 我试过但仍然失败了。 我希望在oracle sql开发中实现它。 谁来帮帮我。 感谢。

4 个答案:

答案 0 :(得分:1)

根据给定的数据尝试以下SQL,它在SQL Server 2012中....

select REPLACE(CONVERT(VARCHAR(10),convert(date,t.[date]), 101), '/', '')
+'00'+convert(varchar(2),row_number()over(partition by account,[date] order by t.[date])) as ID,
t.account,
t.date
from (values ('John','2/6/2016'), 
('John','2/6/2016'), 
('John','4/6/2016'), 
('John','4/6/2016'), 
('Andi','5/6/2016'), 
('Steve','4/6/2016'))T(account,[date])

答案 1 :(得分:0)

<强> MySQL的

我现在可以给你020616001这部分的逻辑....... 对于相同的id +1我必须努力....我会在工作后告诉你

  insert into table_name(id) 
  select concat
  (
    if(length (day(current_date))>1,day(current_date),Concat(0,day(current_date))),
    if(length (month(current_date))>1,month(current_date),Concat(0,month(current_date))),
    (right(year(current_date),2)),'001'
  )as id

答案 2 :(得分:0)

使用statement更新表。

update table set id= replace(CONVERT(VARCHAR(10),CONVERT(datetime ,date,103),3) ,'/', '') + Right('00'+convert(varchar(2),row_number()over(partition by account,[date] order by t.[date])) ,3)

答案 3 :(得分:0)

您无法以正常方式将日期列转换为日期时间类型,因为它是dd / mm / yyyy。

试试这个,

declare @t table(acoount varchar(50),dates varchar(20))
insert into @t values
('John','2/6/2016') 
,('John','2/6/2016') 
,('John','4/6/2016') 
,('John','4/6/2016') 
,('Andi','5/6/2016') 
,('Steve','4/6/2016')

;With CTE as
(select * , SUBSTRING(dates,0,charindex('/',dates)) dd
,SUBSTRING(stuff(dates,1,charindex('/',dates),''),0, charindex('/',stuff(dates,1,charindex('/',dates),''))) MM
,right(dates,2) yy

 from @t 
)
,CTE1 as
(
select *
,ROW_NUMBER()over(partition by yy,mm,dd order by  yy,mm,dd)rn from cte c
)

select *, REPLICATE('0',2-len(dd))+cast(dd as varchar(2)) 
+REPLICATE('0',2-len(MM))+cast(MM as varchar(2))
+yy+REPLICATE('0',3-len(rn))+cast(rn as varchar(2))

from cte1