QA@IT

SQLserverのdate型データとVBで取得した日付を比較するプログラムを記述したいです

8640 PV

初級者です。ASP.NET Webフォームアプリに関する質問です。初歩的なことですが、よろしくお願いします。

※OSはWindows7、.NET Framework4、Visual Stdio 2010、SQLserver2012、IE11を利用しています。

テーブルからdate型のデータを(SQLserver2012を使用)取得し、
VB側の構文「Dim dtToday As DateTime = Date.Today」で取得した日付と比較、
同日なら処理Aを、日付が異なるなら処理Bを実行するようコードを記述したいと考えています。
(質問用に処理A、Bはラベルコントロールにメッセージを表示させるのみとしています)

<テーブルの内容>
tbl_value.PNG

※特定のFacilityIDの日付が最新のレコードを参照して"date"だけを取得します。
現在の格納内容でいえば、取得されるべきは「valueID」が「6」のレコードの「2016-09-08」の部分。
(SQL構文で「FacilityID」を「1」と指定した場合)

<テーブルの構成>
※画像が挿入できないので記し書きします。

valueID : int
valueA ~ valueF : decimal(3,2)
date : date
FacilityID : int

現在のコードでは、双方で取得された日付が異なった場合の処理Bが実行されている状態にあります。

※2016/9/18 15:05記載

ほかのサイトさんで教えていただいた記述方法を試してみると正しい実行結果が得られたので、
記載しておきます。

Imports System.Data.SqlClient

Partial Class dateGet_test2
    Inherits System.Web.UI.Page

    Protected Sub BtnGo_Click(sender As Object, e As System.EventArgs) Handles BtnGo.Click

        Dim day As String = GetDate()

        Dim dtToday As DateTime = Date.Today

        If Date.Compare(Date.Parse(day), dtToday) = 0 Then
            LblMsg.Text = "今日のデータはすでに格納されています"
        Else
            LblMsg.Text = "大丈夫!"
        End If

    End Sub


    'データベースから日付(date型データ)を取得する関数
    Private Function GetDate() As Date


        Dim ret As Date

        Dim cnStr As String = System.Configuration.ConfigurationManager.
            ConnectionStrings("○○○○○○ConnectionString").ConnectionString

        Using connection As New SqlConnection(cnStr)

            Dim SQL As String
            SQL = "SELECT date" &
                 " from tbl_valueTest as A" &
                 " WHERE Exists(SELECT * from tbl_valueTest" &
                 " group by FacilityID" &
                 " having FacilityID = A.FacilityID and MAX(date) = A.date)" &
                 " and FacilityID = 1 "

            Dim command As New SqlCommand(SQL, connection)

            Try

                connection.Open()

                Dim result As String = ""
                result = command.ExecuteScalar()

                ret = CDate(result)

                connection.Close()

            Catch ex As Exception

            End Try

        End Using

        Return ret

    End Function

End Class
  • 質問する際は、一番最初に、何を作っているのか(ASP.NET Web Forms? その他?)、ご自分の環境(OS, .NET, IIS, Visual Studio のバージョン、DB サーバーとそのバージョン、ブラウザを使っているなら何かなど)に関する情報を最低書いていただけませんか? -
  • 加えて、DB のテーブルのスキーマも書いてください。適切に情報が提供されていれば、回答者が質問者さんの状況を的確に把握でき、タイムリーで的を得た回答が得られるということで、質問者さんにもメリットがあります。 -
  • ご指摘ありがとうございます。
    記述不足で申し訳ありませんでした。
    まだ不十分かもしれませんが、わかる範囲で記しましたので、ごらんいただけると幸いです。
    -
  • 最初の質問のときからコードを書き換えたようですが、最初のコードにレスがついているのに書き換えられたのではこのスレッドの話の流れがおかしくなるのは分かりませんか? 検索などでここにたどりついた人がこのスレッドを上から読んでいったら意味不明になってしまいますよね。こういうサイトは情報の共有も目的にしていると思いますが、それに支障が出ると思いませんか? -
  • なので、最初のコードを変えたという話がしたいのなら、話の流れをおかしくしないように、最初のコードは書き換えないでそのままにしておいて、追加する形で書き換えたコードをアップするとかを考えてください。 -
  • 初級者とのことですが、マルチポストとか書き方に気を配るというところについては、初級者だからというのは免罪符にならないと思います。今後は配慮いただけるようよろしくお願いします。 -

回答

【2016/9/8 14:42 訂正】result のあとのもう 1 ステップ CInt(result) を見落としてましたので訂正します。これ、どういう意図があるのでしょう? 期待される結果からはますます遠ざかるように思えるのですが。

SELECT クエリが "SELECT date ..."(date は date 型)で、以下のコードで取得した文字列 ret と、

Dim result As String = ""
result = command.ExecuteScalar()
If result IsNot "" Then ret = CInt(result)

以下のコードで取得した DateTime 型の dtToday を ToString() メソッドを使って文字列に変換した dtToday.ToString() を比較した場合、フォーマットは全く同じになるのでしょうか?

Dim dtToday As DateTime = Date.Today

arika_onzk さんの回答にもありますが、例えば一方が "2016/09/08" 他方が "2016/9/8" というようなことはないですか?

まずはそのあたりをデバッガを使って確認してはいかがでしょう。(そもそもですが、日付を文字列として比較するなら、フォーマットが同一になるように、フォーマッティングのためのコードを自力で書きましょう)

編集 履歴 (1)
  • ご指摘いただきありがとうございます。
    訂正点は私もつい先ほど改善したところで、
    Dim result As String = ""
    result = command.ExecuteScalar()
    ret = CStr(result)
    といたしました。
    -
  • また、フォーマットとデータ型に関しては、ほかのサイトさんでDate.Parseメソッドというものを教えていただいたので、
    If Date.Compare(Date.Parse(day), dtToday) = 0 Then
    とし、GetDate() はdate型で返すようさらに改編しました。
    -
  • 「ほかのサイトさん」ってここですね?
    https://teratail.com/questions/47208
    マルチポストという言葉を知ってますか? 知らなければググってみましょう。私はマナー違反だと思ってます。
    -

DateDiffでintervalをdayにして比較するだけでは?

今後の為に
比較したい場合は型をそろえましょう!
日付を扱うときには特に注意が必要です。
Stringにした場合はFormatまで注意しましょう
"2016/09/08", "2016/9/8", "2016-09-08", "2016-9-8" それぞれ文字列としては全部異なります。

編集 履歴 (1)
ウォッチ

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