QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

日付(yyyy/mm/dd hh:mi:ss)を条件にデータ抽出

いつも参考にさせていただいております。

SQL SERVER2000に格納されているDateTime型のフィールドに
”yyyy/mm/dd hh:mi:ss”の精度でデータが格納されています。
SQL文にてこの日付を条件指定しデータを抽出したいのですが、抽出できません。

例:
2004/01/14 17:51:15のデータに対し
× SELECT * FROM WHERE (KOUSINBI = CONVERT(DATETIME, '2004/01/14 17:51:15'))
△ 〜WHERE (KOUSINBI >= CONVERT(DATETIME, '2004/01/14 17:51:00'))

秒単位に格納されているデータをもとに抽出したいのですが方法を教えてください。

質問者:マシュー

回答

 米田です。

SQL SERVER2000に格納されているDateTime型のフィールドに
”yyyy/mm/dd hh:mi:ss”の精度でデータが格納されています。
 この認識はずれています。
DateTime型はもっと細かいです。
1秒ずらしてはさんでみてください。
(範囲指定)

詳しくは Books Online で確認してください。

投稿者:よねだ

編集 履歴 (0)

よねださん、ありがとうございます。
DateTime型=300分の1秒で格納されているんですよね。
>1秒ずらして範囲指定する
という発想には行き着きませんでした。
この方法でやってみます。

投稿者:マシュー

編集 履歴 (0)

ほむらです。
SQLServerならばConvertしなくても#で はさめば日付型になると思いましたが?

WHERE KOUSINBI = #2004/01/14 17:51:00#

#by うろおぼえ
#個人的に使用するデータの場合、普段は文字列で格納していたりして^^;;;;;

投稿者:ほむら

編集 履歴 (0)

範囲指定でデータをとることはできました。

が、データが1秒間に数件登録されているとすると、
この日付を条件に抽出する事は不可能という事に・・

なりますかね?

投稿者:マシュー

編集 履歴 (0)

 例えば、データベースに秒単位でログが記録されています。このとき、型をDateTime型とします。DateTime型は、日付とマイクロ秒の精度で成り立っているとします。

 このデータテーブルから、特定の日のデータが欲しいとき、どのように問い合わせ句を組めばよいでしょう???

1.BETWEENなどで範囲指定する
 BETWEEN ログ時間 FROM #2004/01/01 00:00:00# TO #2004/01/01 23:59:59#

2.文字型に変換し、一致させる
 TO_CHAR(ログ時間, 'YYYY/MM/DD') = '2004/01/01'

#なんか、形式混ざって変ですね

というように、精度を落とした文字列型に変換して一致させる、ということはできませんか?インデックスが使えなくなり、検索速度は落ちますけど。

投稿者:Jitta

編集 履歴 (0)

ありがとうございました。
いろいろ試した結果、文字型で扱うのが解かりやすい(安定している)
ということでString型として扱うこととしました。
//--------------------------------------------------------------
string st_Date = "2004/01/15 16:54:32.782";
        <省略>
〜WHERE KOUSINBI = CONVERT(DATETIME,'"+ st_Date + "',121)";
//--------------------------------------------------------------
と、この様な感じで抽出できました。
ありがとうございました。

ちなみにSessionに日付型を格納したりすると、ミリ秒がなくなってしまう様でした。
(この場合でも文字型なら当然保持できます。)

投稿者:マシュー

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。