在一天内自动插入带有计数器重置的数据库

时间:2016-05-07 11:15:40

标签: c# asp.net sql-server oracle oracle-sqldeveloper

我有一个像这样的SQL Server表

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

问题是我想在日期之前自动插入“id”列,并将日期更改为字符串,如数据类型(char / varchar)和ADD增量3位数计数器(从001开始)重置每天计数器(当日期改变时重置,但如果日期相同,可以在最后一个计数器处继续)。 例如:

+-------------+---------+-----------+
|     id      | account |    date   |
+-------------+---------+-----------+
| 20160602001 | John    |  2016/6/2 | 
| 20160602002 | John    |  2016/6/2 | 
| 20160604003 | John    |  2016/6/2 | 
| 20160604001 | John    |  2016/6/4 | >counter reset when the date is change
| 20160604002 | Andi    |  2016/6/4 | 
| 20160604004 | Steve   |  2016/6/2 | >counter continue 
+-------------+---------+-----------+

我想在oracle sql开发人员可以帮助我一点吗? 我一直在想在纯数据库查询中尝试这个可能吗? (可以添加更多列或修改一下,只要“id”列保持不变,或者是否需要在C#(ASP.NET)中创建一个函数来执行此操作?因为这是我非常理解的人,有人可以帮我解决这个问题吗? thankyou =)

2 个答案:

答案 0 :(得分:0)

您可以为日期和ID创建单独的列。插入行时只获取当天的最大ID,如果它不存在,则从1开始。如果确实需要,可以为date + id字段创建一个额外的计算列,但是在表中你应该保留他们分开了。

答案 1 :(得分:0)

假设这是Oracle:

如果您的表已经存在,并且您显示了列,并且您想要填充列ID,则可以使用UPDATE语句执行此操作,如下所示。我使用了表名" t" - 您需要将其更改为您在查询中出现的任何位置的实际表名称。我还调用日期列dt(使用Oracle关键字作为表或列名称总是一个坏主意);如果您的专栏真的被称为"日期"你必须用" date"替换dt。 (包括双引号)。

update t set id = 
    (with h(dt,rn) as 
        (select dt, row_number() over (partition by trunc(dt) order by dt) from t)
     select to_char(dt, 'yyyymmdd') || to_char(rn, 'FM009') from h where h.dt = t.dt)

这假定" date" column是一个真正的日期列,带有时间组件,没有" date"相等(同一天的时间组件对所有记录都不同)。否则,select语句将返回多行,插入将失败。在这种情况下,你需要解释你想如何打破关系;插入语句会有点复杂。

相关问题