strtotime()
принимает все виды сумасшедших форматов, вы можете просто сделать это:
$stamp1 = strtotime('today 11 am');
$stamp2 = strtotime('tomorrow 11 am');
Используйте формат S
и replace
стандартные знаки +/- с требуемыми кодами
Вы можете пропустить NVL
, если ваши числовые столбцы не обнуляются. [ 119]
Агрегированная функция SUM
часто используется с PARTITION BY
для различения счетов - см. Комментарий в запросе.
with bal as (
select
id, cr, dr,
sum(nvl(cr,0) - nvl(dr,0)) over (/* PARTITION BY account key */ ORDER BY id) as balance
from accounting)
select
id, dr db,cr,
replace(replace(to_char(balance,'999,999.99S'),'+','CR'),'-','DB') balance
from bal
order by id;
ID DB CR BALANCE
---------- ---------- ---------- ----------------
1 1000 0 1,000.00DB
2 0 200 800.00DB
3 500 0 1,300.00DB
4 0 200 1,100.00DB
5 0 200 900.00DB
6 0 1800 900.00CR
Вы можете попробовать использовать оконную функцию sum
.
CREATE TABLE accounting(
ID int,
EDATE varchar(50),
DISCRIPTION varchar(50),
DR int,
CR int
);
INSERT INTO accounting VALUES (1,'19-JAN-19','cash in',1000,0);
INSERT INTO accounting VALUES (2,'19-JAN-19','cash out',0,200);
INSERT INTO accounting VALUES (3,'19-JAN-19','cash in',500,0);
INSERT INTO accounting VALUES (4,'19-JAN-19','cash out',0,200);
INSERT INTO accounting VALUES (5,'19-JAN-19','cash out',0,200);
INSERT INTO accounting VALUES (6,'19-JAN-19','cash out',0,1800);
Запрос 1 :
select
id,
edate,
discription,
dr,
cr,
sum(DR) over(order by id) - sum(CR) over(order by id) as balance
from accounting
| ID | EDATE | DISCRIPTION | DR | CR | BALANCE |
|----|-----------|-------------|------|------|---------|
| 1 | 19-JAN-19 | cash in | 1000 | 0 | 1000 |
| 2 | 19-JAN-19 | cash out | 0 | 200 | 800 |
| 3 | 19-JAN-19 | cash in | 500 | 0 | 1300 |
| 4 | 19-JAN-19 | cash out | 0 | 200 | 1100 |
| 5 | 19-JAN-19 | cash out | 0 | 200 | 900 |
| 6 | 19-JAN-19 | cash out | 0 | 1800 | -900 |