web-dev-qa-db-ja.com

期間間のレコードを取得する

タイムスパン間のレコードを取得したいのですが、私が持っているのはタイムスパンを示す文字列のスニペットだけです

9:00 AM - 10:00 AM

以下はテーブルスキーマです

CREATE TABLE [dbo].[Samples](
[RID] [int] IDENTITY(1,1) NOT NULL,
[PersonName[nvarchar](20) NOT NULL,
[NOT_AVL_DATE] [datetime] NULL,
[NOT_AVL_FOR] [int] NULL
)

brief: Ridは主キー、PersonNameは従業員/スタッフ/技術者名、NOT_AVL_Dateはスタッフが対応できない日時、NOT_AVL_FORはスタッフが対応できない期間を表します。 1-終日出発2-一日の前半に出発3-一日の後半に出発

要件:与えられたtimeSpanを考えると、その期間に休暇をとっていないスタッフが欲しい。誰かが完全な声明を作成できますか?私の頭はこれについて考えています。

6
Deeptechtons

多くの人が投稿を更新してくれてうれしかったです。簡単に言うと、フロントエンド[プレゼンテーションレイヤー]でAm/Pmの場合、タイムスパンをフィルター処理して0、1、または2に推定します。次に、データアクセスレイヤーでこれを行いますNOT_AVL_FOR <> @FrontendParameter。そのため、時間帯に対応できるスタッフに仕事を割り当てます。これはあなたの正確なニーズに合わないかもしれませんが、ほとんどの場合、フロントエンドはそうでなければ複雑なクエリに答えることができます

1
Deeptechtons

Deeptechtons、私たちはあなたの答えを本当に見たいと思っていますが、あなたはまだそれを投稿していないので、ここでそれを行うことができる方法があります。このSQLはSQL ServerではなくOracle用であるため、変換する必要があります。投稿に欠落している詳細があるため、使用されたいくつかの仮定はおそらく無効です。

with AllEmployees As 
   (select distinct PersonName from samples)
select * from AllEmployees 
minus
select PersonName from samples 
where trunc(not_avl_date) = trunc(sysdate) 
and (not_avl_for = 1
   or (not_avl_for = 2 and :timespan LIKE '%AM%')
   or (not_avl_for = 3 and :timespan LIKE '%PM%')
);

サンプルデータ:

create table samples (rid Number(3), PersonName Varchar2(20), 
   not_avl_date date, not_avl_for integer);

insert into samples values (1,'Peter',sysdate-2, 1);
insert into samples values (2,'Peter',sysdate-1, 2);
insert into samples values (3,'Paul',sysdate-1, 3);
insert into samples values (4,'Sue',sysdate, 3);
insert into samples values (5,'Bob',sysdate-2, 2);
insert into samples values (6,'Zach',sysdate+1, 1);
2
Leigh Riffel