システムwiki

Office:負の時間

Percy.P 解決済 最終更新日:2022-06-26 18:55

データ型は1899年12月30日00:00:00からの日数として実装されるため、DateTimeデータ型の列には任意の期間を格納できると言われています.

PaidLeave= "0:00"、SickLeave= "22:00"、AvailablePaidLeave="16:00"と仮定します.

次の数式を使用すると、最後にAvailablePaidLeaveの不実表示が発生します:

PaidLeave= PaidLeave + SickLeave

AvailablePaidLeave= AvailablePaidLeave-PaidLeave

新しいAvailablePaidLeaveは、「-6:00」ではなく「6:00」になります.

「-6:00」はtableに保存されていますか?フォームに負の時間を表示するにはどうすればよいですか?利用可能なコードはありますか?

返信リスト(回答:6)

1 #
GustavB

>データを失うリスクを冒さずに、日付/時刻フィールドをシングルまたはダブルに変更することはできません.

あなたはそうすることができます、そしてそれはまさにあなたがしなければならないことです. 次のような関数を使用して、データ型Doubleの線形値として日付/時刻値に前後に変換します.

'日付値をタイムスパン値に変換します.

'1899-12-30より前の日付値にのみ役立ちます

'これらは負の数値です.

'

'2015-12-15.グスタフブロック、サボテンデータApS、CPH.

'

パブリック関数DateToTimespan(_

ByVal Value As Date)_

日付として

ConvDateToTimespan値

DateToTimespan= Value

終了関数

'タイムスパン値を日付値に変換します.

'1899-12-30より前の結果の日付値にのみ役立ちます

'これらは負の数値です.

'

'2015-12-15.グスタフブロック、サボテンデータApS、CPH.

'

パブリック関数DateFromTimespan(_

ByVal Value As Date)_

日付として

ConvTimespanToDate値

DateFromTimespan= Value

終了関数

'線形タイムスパン値を参照して日付値を変換します.

'例:

'

' 日にち 時間タイムスパン 日付

' 19000101 0000 2 2

'

' 18991231 1800 1,75 1,75

' 18991231 1200 1,5 1,5

' 18991231 0600 1,25 1,25

' 18991231 0000 1 1

'

' 18991230 1800 0,75 0,75

' 18991230 1200 0,5 0,5

' 18991230 0600 0,25 0,25

' 18991230 0000 0 0

'

' 18991229 1800-0,25 -1,75

' 18991229 1200-0,5 -1,5

' 18991229 0600-0,75 -1,25

' 18991229 0000-1 -1

'

' 18991228 1800-1,25 -2,75

' 18991228 1200-1,5 -2,5

' 18991228 0600-1,75 -2,25

' 18991228 0000-2 -2

'

'2015-12-15.グスタフブロック、サボテンデータApS、CPH.

'

Public Sub ConvDateToTimespan(_

ByRef Value As Date)

Dim DatePart ダブルとして

Dim TimePart ダブルとして

If Value<0 Then

'値の日付(整数)部分を1日シフトして取得

-Int()が切り上げられるときに時間部分が存在する場合は、'.

DatePart=-Int(-Value)

'時間(小数)部分を取得して反転します.

TimePart=DatePart-値

'日付と時刻の部分をアセンブルして、タイムスパン値を返します.

Value= CDate(DatePart + TimePart)

その他

'正の日付値は、設計上、タイムスパン値と同じです.

End If

End Sub

'日付値を参照して線形タイムスパン値を変換します.

'例:

'

' 日にち 時間タイムスパン 日付

' 19000101 0000 2 2

'

' 18991231 1800 1,75 1,75

' 18991231 1200 1,5 1,5

' 18991231 0600 1,25 1,25

' 18991231 0000 1 1

'

' 18991230 1800 0,75 0,75

' 18991230 1200 0,50,5

' 18991230 0600 0,25 0,25

' 18991230 0000 0 0

'

' 18991229 1800-0,25 -1,75

' 18991229 1200-0,5 -1,5

' 18991229 0600-0,75 -1,25

' 18991229 0000-1 -1

'

' 18991228 1800-1,25 -2,75

' 18991228 1200-1,5 -2,5

' 18991228 0600-1,75 -2,25

' 18991228 0000-2 -2

'

'2015-12-15.Gustav Brock、Cactus Data ApS、CPH.

'

Public Sub ConvTimespanToDate(_

ByRef Value As Date)

Dim DatePart ダブルとして

薄暗いTimePart ダブルとして

値<0の場合

'TimeSpanの日付(整数)部分を1日シフトして取得

'Int()が切り捨てられるときに時間部分が存在する場合.

DatePart= Int(CDbl(Value))

'時間(小数)部分を取得して逆にします.

TimePart=DatePart-値

'日付と時刻の部分を組み立てて、日付の値を返します.

値=CDate(DatePart + TimePart)

それ以外の場合

'正のタイムスパン値は、設計上、日付値と同じです.

終了する場合

サブの終了

線形タイムスパンに変換すると、経過時間の値を他の数値と同じように直接加算および減算できます.

拡張使用については、私のライブラリを参照してください VBA.Date.

3 #
Percy.P

親愛なるジー、

迅速な対応ありがとうございます.あなたの方法は機能しているようですが、クエリの代わりにVBAコードを使用しています.また、なんらかの理由で日時の形式を短時間に変更できません.

使用できます

AvailablePaidLeave= AvailablePaidLeave-DateDif( "hh:nn"、SickLeave、PaidLeave)

代わりに

PaidLeave= PaidLeave + SickLeave

AvailablePaidLeave= AvailablePaidLeave-PaidLeave

「-6:00」ではなく、「6:00」が基になるtableに保存されているのがわかります.

上記の私の説明を考慮した解決策はありますか?

パーシー

5 #
Imb

こんにちはパーシー、

いくつかの実験の後、Date型は負の(経過した)日を処理できることがわかりますが、余り(時間の部分)も負になります.

1899年12月31日06:00:00 1.25

1899年12月30日06:00:00 0.25

1899年12月29日06:00:00 -1.25 -0.75の代わりに

もちろん、これを処理するためのコードを作成することもできます.

時間をシングルまたはダブルとして保存し、2つの単純な関数を使用して、最初に変換する方がはるかに簡単です. タイムテキストを数値に変換し、2番目に数値をタイムテキストに変換しますか?

Imb.

応答5# ->にスキップ
6 #
Percy.P

こんにちはImb、

迅速な返信ありがとうございます.ここに質問を投稿する前に、私はすでに同じ日付をテストしていました.何らかの理由で、フィールドのデータ型をシングルまたはダブルに変更できなくなりました.負の時間(24時間以上でも時間と分)を保存または表示するためのソリューション(VBAコード)はありますか?

パーシー

応答6# ->にスキップ
2 #
KenSher 2

期間がゼロ未満の場合は、マイナス記号を式の戻り値に連結することでマイナス記号を追加できます.私のTimeElapsed関数を使用する TimeArithmetic 以前のスレッドで紹介したデモ.最初に30時間の負の時間値(DateTime値として1.25)を変数に割り当てた場合:

期間=Now()-(Now()+ 1.25)

次に、期間がゼロ未満の場合、マイナス記号を期間の絶対値に連結することにより、フォーマットされた時間を時間:分で返すことができます.

? IIf(Duration<0、 "-"、Null)&TimeElapsed(Abs(Duration)、 "nn")

-30:00

応答6# ->にスキップ
4 #
Scottge

データを失うリスクを冒さずに、日付/時刻フィールドをシングルまたはダブルに変更することはできません.私が行う方法は、別のフィールドをSingleまたはDoubleとして追加してから、UPDATEクエリを実行してDate/Timeデータ型を変換することです.

実際、私はそのようにはしません.私がすることは、整数データを使用し、経過時間を分として保存することです.次に、それらをhh:mmに変換して表示します.