2011-08-03 22 views
10

ここでは完全性のために多かれ少なかれです。SQL Server:時間を保存する最も最適な方法(日付なし)

Microsoft SQL Serverには日付と時刻を格納するためのフィールドタイプdatetimeしかありません。

しかし、私は営業時間のリストを保存したいとしましょう。日付はまったく関係ありません。現在、私はdatetimeタイプを使用していて、単純にデータの時間部分を表示しています。しかし、私はこれに2つの問題があります。

  1. これは扱いにくいようです。
  2. 将来の開発者は、どこにでも使用されているかどうかわからない可能性のある本格的な日付を見ることを混乱させる可能性があります。

そして、それは質問をする。具体的なtimeフィールドがない場合(MySQLのように)、特定の時刻(00:00から23:59まで)を保存する最も最適な方法は何ですか?

UPDATE:これは、SQL Server 2005の(。また、私はちょうど何timeタイプが存在しない場合、一般的には何をすべきかを知ることに興味があると思います)

+2

このSQL Server 2008以降(交差指)は、Timeデータ型を使用するだけで済みます。ます。http:時間のデータ型を持つ2008+ –

+1

SQL Serverの//msdn.microsoft.com/en-us/library/ms187752.aspx –

+0

SQL Serverは、[時間]をご紹介しました(http://msdn.microsoft.com/en -us/library/bb677243.aspx)2008年のデータ型。 –

答えて

7

...

あなただけの分を知りたい場合は、1-1440の範囲のintとしてそれを格納することができます。 1は00:01であり、14400:00です。

あなたが好きなら、再び時間として表示を行うのは簡単だろう:

SELECT CAST((605/60) as varchar) + ':' + RIGHT('0' + CAST((605 % 60) as varchar), 2)

本の追加の利点は、あなたがsmallintデータを使用する場合は、レコードごとに1-3のバイトを保存している入力することです組み込みのTIMEデータ型から取得します。

TIMEは1行あたり3~5バイトを使用し、smallintは1行あたり2バイトです。

余分なバイトは、私が信じる秒数と分数秒です。

EDITは

それは秒と、より複雑な私は考えなければならまだなんとかです...

1から86400の範囲(一日あたりの秒)

DECLARE @i INT 
SET @i = 3661 

SELECT RIGHT('0' + CAST((@i/3600) as varchar),2) --hours 
+ ':' + RIGHT('0' + CAST((@i % 3600)/60 as varchar), 2) -- minutes 
+ ':' + RIGHT('0' + CAST((@i % 3600)%60 as varchar), 2) -- seconds 
+0

興味深い。時間、分、秒がほしいと思ったらどうしますか? – Teekin

+1

@Helgiは編集を参照してください – JNK

+0

'0からn-1までの範囲を使用します。真夜中は通常、1日の終わりの最後の瞬間ではなく、1日の開始時の最初の瞬間とみなされます。 (それは事例に依存しますが、私の経験ではこれはかなり正常です)。 – MatBailie

2
+2

これは、現在「SQL Server 2008」にのみ適用されます。 – JNK

+1

@JNK trueですが、作成者はバージョン要件を指定していません。 –

+0

私は知っていますが、あなたはこれらの場合にそれを認定するだけで十分です。バージョンが指定されていないが、ソリューションがバージョン固有の場合は、その答えに言及してください。 – JNK

5

SQL Server 2008のがありますTIMEデータ型:

http://www.sql-server-performance.com/2007/datetime-2008/

DECLARE @dt as TIME 
SET @dt = getdate() 
PRINT @dt 

SQL 2008にアップグレードしますか?

SQL Server 2005またはそれ以上の年齢のために
+0

+1 SQL Server 2005には、すでに "確実にアップグレードする時間"があります。 –

+0

あなたは商用のクローズドソースソフトウェアとどのように動作するのか知っていますか?所有権コストは、アップグレードするまで問題になりません。 ;) – Teekin

2

は個人的に私はDATETIMEまたはSMALLDATETIMEを使用してから離れて移動するのに十分で提起としての点を考慮していないでしょう。 SMALLDATETIME

  • 人々は暗黙の型変換を引き起こすSMALLINTと間違いを犯す(増加CPU負荷)
  • ディスク容量は安いです、あなたが追加するバイトの多くを必要とするが行うようにアンINTは、4つのバイトを使用しています

    • anythign重要
    • コードまでのようなWHERE minutes < 720は、(HHへDATETIMEの変換など:mm)のWHERE time < '12:00'
    • 表示の問題よりも少ない理解できるクライアントで頻繁に最高の場所です
    • DATETIMEを使用すると

      など、そのようなものが代わりに私は、そのような彼らは、主に平均期間を計算するために使用しているときのように、秒数を保持する整数フィールドを使用している、と述べた分

    の秒に移動し、将来の柔軟性を可能に

    タイプを選択する際に私が一番考慮すべき点は、値の使用方法です。読みやすいコードと実行可能な実行計画を保証します。

  • +0

    +1 - 非常に有効なポイントです。私の答えのバイトについての私の主張は、おそらく私の個人的な経験に関連しています。私は非常に大規模な(600m - 2bの行)テーブルがたくさんあり、もし私がすぐに追加する行ごとに数バイトを削ることができます。 – JNK

    +0

    非常に真実ですが、4GBでも比較的小さいという激しい議論があります。 – MatBailie

    0

    SQL 2008には、他の人が指摘しているとして、この問題を修正しましたが、2005年に:

    あなたが時間上の任意の日付の計算を実行する必要がありますか?そうでない場合は、文字列として格納できます。

    日付計算を実行する必要がある場合は、わかりやすい列名と一緒にゼロに設定日と日時は、将来の開発者(と心の中で私たちを維持するためのおかげで)切り株べきではありません。

    そして、はい、日時、時間だけのストレージのための不格好ですが、それがうまく機能します。

    関連する問題