2017-03-01 16 views
0

OPENING TIMEが現在の時刻よりも長く、OPENING DATEと現在の日付との日付差が< = 3と> = 0であるレコードを選択するクエリを作成しました。通知ポップアップは実際には仕事は3日以内に開かれています。一度それが開かれると、レコードは選択されません。すなわち、日付の差は0であり、現在の時間は上記の開始時間よりも長くなります。クエリがどのシナリオでも機能しないのはなぜですか?

私のクエリは、< = 3および> = 0のレコードを選択するような場合がありますが、現在の時間が任意の日の開始時間よりも長くなっていない場合は機能しません。 AND演算子を使用しているので、オープニング時間が14:00で現在の時間が14:01になると、< = 3および> = 0も失敗します。

マイクエリ:

Declare @NotificationAllowed bit 
    Set @NotificationAllowed= ISNULL((Select NotificationAllowed from Roles where RoleID= @RoleID),0) 

    IF @NotificationAllowed=1 
    BEGIN 
     Select @NotificationAllowed as IsAllowed, Works.NIT_No, Works.WorkNo, Works.WorkName, DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) as TotalDaysRemaining 
       ,Convert(varchar(11), Works.OpeningDate, 106) as OpeningDate 
     from Works 
     Where DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) <=3 
     AND 
     DATEDIFF(day, Convert(date,GETDATE()), Works.OpeningDate) >=0 
     AND 
     CONVERT(varchar(5), Works.OpeningTime, 108) > CONVERT(varchar(5), GETDATE(), 108) 
     AND 
     Works.Organization_ID= Case When @RoleID=1 then Works.Organization_ID ELSE @OrgID end 
    END 
    ELSE 
    BEGIN 
     Select 0 as IsAllowed, '' AS NIT_No, '' AS WorkNo, '' AS WorkName, '' as TotalDaysRemaining, null as OpeningDate 
    END 
+0

https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/質問を改善するにはこのリンクをご覧ください – TheGameiswar

+0

@TheGameiswarありがとう先生、私は今のところあなたの質問に私を助けることができますか? – Covert

+0

これは釈明ではありません、あなたがリンクを通過し、それをリフレームするのに時間がかかる要求 – TheGameiswar

答えて

0

代わりに別のフィールドとして日付と時刻で動作するようにしようと、それらを一緒に入れて、ちょうど日時データ型を使用する方がよいでしょう。あなたのスキーマからOpeningTimeフィールドを削除し、OpeningTimeをdatetimeとして使用しました。

+ ------ + ------- + -------- + ----------------------- + 
| NIT_No | Work_No | WorkName | OpeningDate    | 
+ ------ + ------- + -------- + ----------------------- + 
| 1  | 1  | Work1 | 2017-02-26 16:21:15.083 | 
| 2  | 2  | Work2 | 2017-02-27 09:21:15.083 | 
| 2  | 3  | Work3 | 2017-03-01 00:21:15.083 | 
| 3  | 4  | Work4 | 2017-03-01 13:09:15.083 | 
| 4  | 5  | Work5 | 2017-03-02 13:21:15.083 | 
| 5  | 6  | Work6 | 2017-03-03 17:21:15.083 | 
| 5  | 7  | Work7 | 2017-03-04 11:45:15.083 | 
| 5  | 8  | Work8 | 2017-03-04 19:21:15.083 | 
+ ------ + ------- + -------- + ----------------------- + 

をあなたが先にGETDATEの開会日ですべてのレコードを維持したいと未満3日間離れて_____へ:

create table Works (
    NIT_No int, 
    WorkNO int, 
    WorkName varchar(32), 
    OpeningDate datetime 
) 

ここで私が使用するいくつかの例のデータです。そして、ここで私たちは空白を埋める。あなたは時間に正確であることを気にしますか?これはあなた次第で、おそらくアプリケーションによって異なります。分を使うつもりです。だから、getdateから0〜3 * 24 * 60分の日付を入れたいと思っています。次のクエリは、ちょうど2017年3月1日12:35上でそれを実行すると

Select @NotificationAllowed as IsAllowed, 
     NIT_No, 
     WorkNo, 
     WorkName, 
     DATEDIFF(day, GETDATE(), OpeningDate) as TotalDaysRemaining, 
     OpeningDate as OpeningDate 
    from #Works 
    Where DATEDIFF(Minute, GETDATE(), OpeningDate) between 0 and 3*24*60 

が、私は次のような結果

+ ------ + ------- + -------- + --- + ----------------------- + 
| NIT_No | Work_No | WorkName | TDR | OpeningDate    | 
+ ------ + ------- + -------- + --- + ----------------------- + 
| 3  | 4  | Work4 | 0 | 2017-03-01 13:09:15.083 | 
| 4  | 5  | Work5 | 1 | 2017-03-02 13:21:15.083 | 
| 5  | 6  | Work6 | 2 | 2017-03-03 17:21:15.083 | 
| 5  | 7  | Work7 | 3 | 2017-03-04 11:45:15.083 | 
+ ------ + ------- + -------- + --- + ----------------------- + 

を得ることをあなたがしなければならないのは、論理的なプログラムの流れを含み、余分なですんOrganization_IDのフィルタ。

関連する問題