- - PR -
SQLServer2005のDateTime型のSQLについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-08-01 16:29
こんにちは。
SQLServerで、同日日付のものを条件にしたいのですが、 from Table t where t.thisDate = convert(DateTime, ?, 112) ?はDate型引数が入ります。 TableのthisDateカラムはdatetime型です。 このようにした場合、取得できませんでした。 ご教授くださいませ。 よろしくお願いします。 | ||||
|
投稿日時: 2007-08-01 16:39
追記です。
where t.thisDate = DATEPART ( wk , ? ) こちらで試してもだめでした。 よろしくお願いします。 | ||||
|
投稿日時: 2007-08-01 17:11
なぜ日付型を日付型に変換しようとしているんですか? 年月日の精度に丸めたいのかな。それなら convert(datetime, convert(char, ?, 112), 112) これで時分秒を切り捨てた年月日精度の datetime 型になります。
| ||||
|
投稿日時: 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-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になっています・・) よろしくお願いします。 | ||||
|
投稿日時: 2007-08-02 03:54
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-08-02 07:34
TO_CHAR を使用して YYYY/MM/DD 形式に両方修正してチェックすれば
1日分/1か月分/1年分の単位なら可能か うまく出来ない場合は直接SQLを叩いて実行してソレを元にJAVA上で実装するのもいいでつよ | ||||
|
投稿日時: 2007-08-02 09:46
SQLServerだと多分TO_CHARは使えないですね。
|