blog.toxn

あしあと

.net, sqlserverで時間を扱う時のTipsとか

時間の計算とか、保存をする際に色々ハマったので。

はじめに

時間を扱うにあたって、実世界ではよくある「25時」とか「40時間」みたいな表記を.net frameworkSQL Serverなどで用意されている時刻型データではうまく扱うことができず、文字列型で保持するような記事が散見されるのだけど、できるだけ時刻型データを使う方向で調査し得られた知見を残す。

.net編

日時データはDateTime、時間はTimeSpanを利用する。

25時とか非実在の時刻を表現するために

一度、TimeSpanに入れて、DateTimeに加算する。

giste189915923de3dbbd94503b4e67dfc57

TimeSpanをLinqで扱うとき

TimeSpanのList等を使う際には、Ticksを使う。

LinqでTimeSpanは使えず、プリミティブな数値型しか受け付けてくれないので、Ticks(long型)を介して集計等を行う。

↓例

TimeSpan-sample01.cs

SQL Server

TimeSpanはTicksにしてbigintで保持

SQL Serverにはtime型があるが、有効範囲は00:00:00.0000000〜23:59:59.999999なので、24時間以上の時間は保持できない。(MySQLは838:59:59まで保持できるのに)

数時間ならばいいが、24時間を超えた経過時間を持つ際にはTicksでの保持になる。

既にTime型で持っている場合は、次の関数でbigintに変換すればよい。

TimeToTicks.sql

参考:

time (Transact-SQL)

stackoverflow.com

stackoverflow.com