- PR -

SQLServer2005のDateTime型のSQLについて

投稿者投稿内容
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-08-01 16:29
こんにちは。

SQLServerで、同日日付のものを条件にしたいのですが、
from Table t where t.thisDate = convert(DateTime, ?, 112)

?はDate型引数が入ります。
TableのthisDateカラムはdatetime型です。

このようにした場合、取得できませんでした。

ご教授くださいませ。
よろしくお願いします。
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-08-01 16:39
追記です。

where t.thisDate = DATEPART ( wk , ? )

こちらで試してもだめでした。

よろしくお願いします。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-08-01 17:11
なぜ日付型を日付型に変換しようとしているんですか? 年月日の精度に丸めたいのかな。それなら convert(datetime, convert(char, ?, 112), 112) これで時分秒を切り捨てた年月日精度の datetime 型になります。
リックス
常連さん
会議室デビュー日: 2001/10/01
投稿数: 47
お住まい・勤務地: 東京
投稿日時: 2007-08-01 18:11
まず、前置き。
TableのthisDate列の値は、すべて0時0分0秒なのでしょうか?
SQL ServerのDateTime型は、必ず時刻情報を持ちます。
Convert関数などで切り捨てても、0時0分0秒となります。

さて、本題。
t.thisDate列の値は時刻も含んでいて、ヒットしないと仮定して話をします。

2007/8/1 17:45:30 という値があり、8月1日のデータがほしい場合、
〜 WHERE 2007/08/01 17:45:30 = 2007/08/01 00:00:00
でヒットするでしょうか?しませんね。

WHERE 2007/8/1 17:45:30 >= 2007/08/01 00:00:00
AND 2007/8/1 17:45:30 < 2007/08/02 00:00:00
の形でヒットできます。
つまり、時刻を含む日時データで、日単位でデータ収集するなら、
当日0時以上、翌日0時未満で条件を組まなければいけません。


なので、私なら、
埋め込みSQL文は、
from Table t where t.thisDate >= ?
and t.thisDate < DateAdd(d,1, ?)
とし、第1、第2パラメータに欲しい当日の0時をセットします。
時刻部の切り捨て(0時0分0秒にする)は、SQLServerのSQL文でやるより、
ホスト言語(JAVAかな?)で行うほうが容易なので、そちらで整理して
セットするようにします。


不明な要素が多いので仮定で話をしましたが、意図した内容だといいのですが。
以上、参考まで。
ぱちぱち
常連さん
会議室デビュー日: 2007/03/05
投稿数: 31
投稿日時: 2007-08-01 19:14
ありがとうございます、大変参考になりました。
コピペで実際やってみたのですが、何故かインクリメントされたデータが
取得されてしまいます(Javaです)。

from Table t where t.thisDate >= ? and t.thisDate < DateAdd(d,1, ?)

System.outしたら以下の通り、2007/07/30のデータをセットしていました。
Mon Jul 30 00:00:00 JST 2007,Mon Jul 30 00:00:00 JST 2007

しかし、テーブルのデータで見ると2007/07/31のデータを取得しているようです。
seq, thisDate
0 2007/07/29 0:00:00
1 2007/07/30 0:00:00
2 2007/07/31 0:00:00

時刻の00のセットの仕方、及びDBのスケールに起因しているのでしょうか?
(見るとDBは0:00:00になっています・・)
よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-02 03:54
引用:
where t.thisDate = DATEPART ( wk , ? )

なぜweek??

Tableという名前のテーブルが実際にあるわけじゃないですよね?(あるならクオートすればいいけど)

select * from [Table] t where t.thisDate >= '2007-07-30' and t.thisDate < '2007-07-31'
このように直接日付いれて試した場合どうですか?これでうまくいくならjava側の問題ですね。
javaでは何使ってます?sqlserver.jdbcでPreparedStatement?コードはどうなってますか?

あとは考えにくいけどグリニッジ標準時とか。

[追記]
あれ、System.outでその形式で出るって事はjava.sql.dateじゃないからPreparedStatementじゃないのかな。

[ メッセージ編集済み 編集者: べる 編集日時 2007-08-02 03:58 ]
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-08-02 07:34
TO_CHAR を使用して YYYY/MM/DD 形式に両方修正してチェックすれば
1日分/1か月分/1年分の単位なら可能か

うまく出来ない場合は直接SQLを叩いて実行してソレを元にJAVA上で実装するのもいいでつよ
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-02 09:46
SQLServerだと多分TO_CHARは使えないですね。

スキルアップ/キャリアアップ(JOB@IT)