- PR -

「今日」だけ表示ができない

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-10-04 12:45
私の読解力不足で未だに仰っている事があまり理解できていないのですが。
「他の日付は取得できる」の意味も分かっていません。
ずばっと言っちゃいましょう。

カラム「日付」をそのまま比較するのを止めてください。
日付型には実際には秒までではなく、さらに秒以下の値が入っています。
例)2006/10/04/00:00:00.100
これと 2006/10/04/00:00:00 を比較しても一致しません。
「秒」まで比較したいなら、CONVERT 関数で秒まで切ってください。

_________________
囚人のジレンマな日々
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-04 13:44
2006/10/03から一日たったわけですが「特定の日時を検索する」方の機能で
昨日の日付を渡したら、想定どおりのデータが取得できますか?
取得できているならデータの問題ではなくC#の問題が濃厚ですね。

2004/10/03は「今日」(もう昨日だけど)ではありませんがそういう勘違いということはないですか?

「Page_Loadで」ということはWEBアプリでいいんですよね?

引用:
カレンダーをクリックしたときも

「特定の日時を検索する」機能の入力方法はカレンダーなのですか?
「特定の日時を検索する」機能の方のイベントハンドラのソースはどうなっていますか?

[追記]
書き忘れました。SqlDataSourceだけでは表示できませんよね。何で表示してますか?

[ メッセージ編集済み 編集者: べる 編集日時 2006-10-04 13:48 ]
未記入
ベテラン
会議室デビュー日: 2003/06/26
投稿数: 76
投稿日時: 2006-10-04 13:50


[ メッセージ編集済み 編集者: 未記入 編集日時 2007-01-19 21:41 ]
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-04 14:07
先日ご助言いただいたので、現在は日付は.Todayで取得し、念のため関数内で
DateTime datetimeMem = new DateTime(2004, datetimeTemp.Month, datetimeTemp.Day, 0, 0, 0);
として、時間を全て0で埋めるようにしてから比較しています。

また、CONVERT関数はありましたので、

(CONVERT (DateTime, 日付, 111) = '" + datetimeTemp + "')

として比較するようにしました。


今回のアプリは、おっしゃるとおりWEBアプリで、GridViewでデータを表示しています。
日時を指定する方法は2通りあって、カレンダーで指定する方法と、日付をテキストボックスに入力して検索ボタンを押す方法とあります。

またこのアプリでは「時間」は一切使用しませんが、DBには時間が全て0:00:00の状態で、DateTime型で入力されています。ですので、時間の取得は.Nowではなく.Todayで取得しており、そのため取得した時間も全て0:00:00になっていると思うのですが……。

もちろん、イレギュラーな場合も考えて、もし0:00:00ではない時間が入ってきても、強制的に0:00:00に変換するような処置もとってあります。


_________________
◇◇◇ 社内SEを兼務する文系プログラマーです。
◇◇◇ WinXP VisualStudio2005(C#メイン) MSSQL とかを使っています。
◇◇◇ 周囲にプログラマがいないので、みなさんだけが頼りです(;ω;`)


[ メッセージ編集済み 編集者: Wingard 編集日時 2006-10-04 14:10 ]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-10-04 14:22
こんにちは。

ちょっと補足で。
datetimeTemp って初めて出てきました
少し状況を整理して、囚人さんたちがおっしゃっていることをまとめると、こんな感
じのコードになると思います。

コード:

protected void getDB(DateTime datetimeTemp)
{
    DateTime datetimeMem = new DateTime(
        2004,
        datetimeTemp.Month,
        datetimeTemp.Day,
        0,
        0,
        0);

    strSelectCommand = string.Empty; 
    strSelectCommand += "SELECT タイトル,コメント FROM 情報 WHERE ";
    strSelectCommand += "CONVERT (DateTime, 日付, 111)=";
    strSelectCommand += "'" + datetimeMem.ToString("yyyy/MM/dd") + "'";
(以下省略)


これでちょっと試してみてくださいな。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-04 14:35
>ぽぴ王子様
ああ、すみません、変数名、本物ではシステムがわかるような名前をダイレクトに付けていたもので(つД`)・。毎回手書きで書き換えているうちに混乱してしまったようです……。


下記のものを実行しましたら、

SELECT タイトル,コメント FROM 記念日情報 WHERE CONVERT (DateTime, 日付, 111)='2004/10/04'

と出てきました。時間が消えていますね。ですが、現象変わらずです;
ちなみにさっきのCONVERTのときは、

SELECT タイトル,コメント FROM 記念日情報 WHERE (CONVERT (DateTime, 日付, 111) = '2006/10/04 0:00:00')

と出ていましたが、それでも比較はちゃんとできていたようです……。これがシステム的に良くない可能性も考えて、ぽぴ王子様の方法も使ってみます。


_________________
◇◇◇ 社内SEを兼務する文系プログラマです。
◇◇◇ WinXP VisualStudio2005(C#メイン) MS・SQLServer とかを使っています。
◇◇◇ 周囲にプログラマがいないので、みなさんだけが頼りですヽ(`Д´;ノ
Wingard
大ベテラン
会議室デビュー日: 2004/10/04
投稿数: 168
お住まい・勤務地: 頭の中はファンタージェン
投稿日時: 2006-10-04 14:44
みなさんご回答ありがとうございます。

あまりこれだけに時間もかけていられないので、ご回答いただいていて申し訳ありませんが、ひとまず締めたいと思います。

最初のPage_Loadのときに呼び出さなければ、「今日に戻る」ボタンなども使えますので、ひとまず「起動時には呼び出されません。仕様です^^」で押し切ります(つД`)
それで納得してもらうしかないと判断しました。

また時間のできたときに、じっくり考えてみたいと思います。
本当に長々とお付き合いくださり、ありがとうございました。
_________________
◇◇◇ 社内SEを兼務する文系プログラマです。
◇◇◇ WinXP VisualStudio2005(C#メイン) MS・SQLServer とかを使っています。
◇◇◇ 周囲にプログラマがいないので、みなさんだけが頼りですヽ(`Д´;ノ
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-04 14:57
あ〜、わかった気がします。

まずPage_LoadでgetDBを呼び出すときに!IsPostBack判定してますか?
してないなら「カレンダーで指定する方法」のときもそのPage_Loadのロジックを
通ってしまうことはわかりますか?

そうすると今日を設定した場合、2回同じデータをバインドすることになります。
同じSelectCommandが連続で指定された場合データを取りにいかないようにできてるのかな。
実際SqlDataSourceのSelectingイベントとかが発生してないと思います。


引用:
今回のアプリは、おっしゃるとおりWEBアプリで、GridViewでデータを表示しています。

やるなら
SqlDataSource1.DataBind();
じゃなくて
GridView.DataBind();
にすべきと思います。リファレンスには
「Select メソッドは、SqlDataSource にバインドされたコントロールの DataBind メソッドが呼び出されたときに、そのコントロールによって自動的に呼び出されます。データ バインド コントロールの DataSourceID プロパティを設定すると、コントロールは必要に応じてデータ ソースのデータに自動的にバインドされます。」
とありますから。

ちなみに、DataBind();がなくても!IsPostBack判定すれば正常に動くと思います。



あ、、締まってるww

[ メッセージ編集済み 編集者: べる 編集日時 2006-10-04 14:58 ]

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