1
table:
--duedate timestamp
--submissiondate timestamp
--blocksreq numeric
--file clob
--email varchar2(60)

各エントリは、blocksreqを実行するためのファイルです。1日あたり8ブロックが割り当てられます(ただし、後で変更できます)。テーブルに挿入する前に、NOW()と@duedateの時間枠でそれを達成するのに十分なブロックがあることを確認したい

私は次のことを考えていましたが、私はそれを間違っていると思います:

R1 = select DAY(), @blocksperday - sum(blocksreq) as free 
     from table 
     where @duedate between NOW() and @duedate 
     group by DAY() 
     order by DAY() desc

R2 = select sum(a.free) from R1 as a;

if(R2[0] <= @blocksreq){ insert into table; }

部分的な擬似コードを許してください。

SQLフィドル: http ://sqlfiddle.com/#!2 / 5bda5

警告:私のSQLフィドルにはガベージコードがあります...多くのテストケースを作成する方法がわからないためです。また、期日をNOW()+5日に設定しません

4

1 に答える 1

1

このようなもの?(部分的な日がどのように処理されたかわからなかったので、その部分を無視しました)

CREATE TABLE `DatTable` (
  `duedate` datetime DEFAULT NULL,
  `submissiondate` datetime DEFAULT NULL,
  `blocksreq` smallint(6) DEFAULT NULL
) 

SET @duedate:='2012-10-15';
SET @submissiondate:=CURRENT_TIMESTAMP;
SET @blocksreq:=5;

INSERT INTO DatTable(duedate,submissiondate,blocksreq)
SELECT @duedate,@submissiondate,@blocksreq
FROM DatTable AS b
WHERE duedate > @submissiondate
HAVING COALESCE(SUM(blocksreq),0) <= DATEDIFF(@duedate,@submissiondate)*8-@blocksreq;
于 2012-10-10T21:13:50.793 に答える