2016-05-20 3 views
0

私はSQL Serverのデータベースにテーブルを持っています。フロントエンド(VBコード)でVB.NETとSQL Serverで特定の月末を得る方法

ID  StartDate    EndDate    Notes 
0  2016-01-24 02:50:23  2016-01-25 08:00:05 somethingoranother  
2  2016-01-30 22:00:00  2016-02-05 08:00:05 somethingoranother 

データの例Iは、テーブルの各行を取り、時間、分、秒単位で時間をカウントしています。例:しかし

something = something + table.Row(i)("Enddate") - table.Row(i)("startdate") 

、私は日付のレポートを引っ張って、31/01/2016から01/01/2016、それは5/02/2016まで、行ID 2の全体の時間を含めています。

30/01/2016から31/01/2016 23:59:59までの1月の時間はどのようにして取得できますか?

+0

2012年1月1日から31/01にレポートをプルすると/ 2016あなたはどの列を選択するのですか?なぜですか? – shadow

+0

あなたの*入力*をこの仕事に説明し、あなたの*予想される*出力が何であるかを説明できれば助けになります。また、あなたはなぜ*最後の1秒の間に*真夜中前に起こることを除外したいのですか?通常、連続したデータ(datetimeのようなもの)の場合は、* <1/31/2016 23:59:59'の代わりに '<01/02/2016' - 一般に計算が簡単で、datetimeデータ型の精度が正しいかどうかを心配する必要はありません) –

+0

私がやっていることは、制作時間を計算することです。時間と日付は非常に限定的でなければなりません。私の仕事は、何かが別の月にかけて実行されているときを除いて、私が得る全生産時間を得ることです。したがって、私は月末までにのみ計算したいと思います。 – someone13

答えて

0

特定の日付のレコードのみを所定の日付にする必要があります。あなたのテーブルの行を返す

Dim fromthis As Date = #01/01/2016# 
Dim tothis AS Date = #01/02/2016# 

For i As Integer = 1 To XXX 
    If(table.Row(i)("startdate") >= fromthis and tothis > table.Row(i)("Enddate")) 
     something = something + table.Row(i)("Enddate") - table.Row(i)("startdate") 

    If(table.Row(i)("startdate") < fromthis and table.Row(i)("Enddate") > fromthis) 
     something = something + table.Row(i)("Enddate") - fromthis 

    If(table.Row(i)("startdate") < tothis and table.Row(i)("Enddate") > tothis) 
     something = something + tothis - table.Row(i)("startdate") 

    End If 
Next 

またはあなたのクエリが与えられた利益のために結果を制限することができます:あなたのフロントエンドでの添加は、行があなたの合計でカウントする必要があるかどうかを確認しなければならないコードの一部。この方法は、不要なデータをロードしないので、よりクリーンです。

SELECT ID 
, CASE WHEN StartDate < @fromDate THEN @fromDate ELSE StartDate END as StartDate 
, CASE WHEN EndDate > @toDate THEN @toDate ELSE EndDate END as EndDate 
, Notes 
FROM yourtable 
WHERE (StartDate >= @fromDate) 
OR EndDate <= @toDate 
OR (StartDate < @fromDate AND EndDate > @toDate) 
+1

これが解決策であるかどうかわかりません。しかし、あなたのコードでは、 'toThis'は'#01/02/2016# 'と' tothis <= table.Row(i)( "Enddate")) '' tothis> table.Row(i) "Enddate")) '。 – shadow

+0

@ shadow thank、編集済み –

+0

@RaulSebastianあなたの答えに感謝します。私はこれらの行に沿って考えていたが、問題はあなたが日付をハードコードできないことである。これは私が直面している問題の一つです。そして、我々は最後の行(行ID 2)を無視することはできませんが、それはまだ1日も必要です。 – someone13

0

多分これはあなたが何を意味するのかで、これを試してみてください:ような何か行0が2行と同様に扱われるべきであると仮定すると、

create table #test(
    Id int not null identity(1,1) primary key clustered, 
    StartDate datetime not null, 
    EndDate datetime not null 
) 

insert into #test values ('2016-01-24 02:50:23', '2016-02-05 08:00:05') 
insert into #test values ('2016-01-30 22:00:00', '2016-02-05 08:00:05') 
insert into #test values ('2016-01-01 22:00:00', '2016-01-01 23:00:00') 


select * from #test 


declare @startCheck datetime 
declare @endCheck datetime 

set @startCheck = '2016-01-01' 
set @endCheck = '2016-02-01' 


select 
    id, 
    startDate, 
    endDate, 
    [Hours in January] = 
     case 
      when endDate >= @endCheck then datediff(hour, startDate, @endCheck) 
      when endDate < @endCheck then datediff(hour, startDate, endDate) 
     end 
from 
    #test 
where 
    (1=1) 
    and (startDate >= @startCheck) 

drop table #test 

結果

Id StartDate    EndDate     Hours in January 
1 2016-01-24 02:50:23.000 2016-02-05 08:00:05.000 190 
2 2016-01-30 22:00:00.000 2016-02-05 08:00:05.000 26 
3 2016-01-01 22:00:00.000 2016-01-01 23:00:00.000 1 
+0

こんにちは@shadow、私はSQLのものを複雑にしようとしていません。私はできるだけシンプルなクエリを維持しようとしています。あなたのご意見ありがとうございます。 – someone13

0

は、私はこれがないと思いますあなたが望むもの:

declare @t table (ID int not null,StartDate datetime not null,EndDate datetime not null, 
        Notes varchar(217) not null) 
insert into @t(ID,StartDate,EndDate,Notes) values 
(0,'2016-01-24T02:50:23','2016-02-05T08:00:05','somethingoranother'), 
(2,'2016-01-30T22:00:00','2016-02-05T08:00:05','somethingoranother') 

declare @Start datetime 
declare @End datetime 

select @Start = '20160101',@End='20160201' 

;With Clamped as (
    select 
     ID, 
     CASE WHEN StartDate > @Start THEN StartDate ELSE @Start END as StartDate, 
     CASE WHEN EndDate < @End THEN EndDate ELSE @End END as EndDate, 
     Notes 
    from 
     @t 
    where 
     StartDate < @End and 
     @Start < EndDate 
) 
select 
    *, 
    DATEDIFF(second,StartDate,EndDate) as ElapsedTime 
from 
    Clamped 

@Start@Endはもちろんパラメータになります - これはサンプルコード用です)。

結果は:

ID   StartDate    EndDate     Notes    ElapsedTime 
----------- ----------------------- ----------------------- ------------------- ----------- 
0   2016-01-24 02:50:23.000 2016-02-01 00:00:00.000 somethingoranother 680977 
2   2016-01-30 22:00:00.000 2016-02-01 00:00:00.000 somethingoranother 93600 

したがって、行0は26時間を貢献して189時間、9分、37分に寄与し、行2れます。私があなたの問題を理解していれば、それらの値は正しいと思われます。

最終的なクエリでこのデータを集計するかどうか、またはVB内でこれを行うかどうかは、あなた次第です。 TimeSpanクラスを使用して、VBでやっていた何かのように時間、分、秒の単位で時間の訳を秒単位で残します。 (SQL Serverでは時間帯ではなく時間を表す対応するデータ型がないため、SQL Server内では簡単には実行できません)

関連する問題