0

この種のシナリオがある場合、MS SQL Server で使用する正しい日付形式は何ですか?

--This values here will be supplied by a datetimepicker Control
@StartDate = '05/15/2013 10:00 PM' 
@EndDate = '05/16/2013 06:00 AM'

SELECT * 
FROM tblSomething 
WHERE TransDate >= @StartDate AND TransDate <= @EndDate

TransDate フィールドの書式を設定するにはどうすればよいですか?

これは正しいです?

Declare @StartDate as datetime
Declare @EndDate as datetime

set @StartDate = '05/15/2013 10:00 PM'
set @EndDate = '05/16/2013 06:00 AM'


Select * from tblSomething Where convert(varchar(20),TransDate,100) >= convert(varchar(20),@StartDate,100) and convert(varchar(20),TransDate,100) <= convert(varchar(20),@EndDate,100) 

AM/PM が私にとって重要な理由は、夜 10 時から翌朝 6 時に取引を終了する従業員がいるからです。その時間枠でその従業員のトランザクションを抽出する必要があります。

4

1 に答える 1

6

日付形式について考える必要がある場合は、間違っています。

DateTimePicker コントロールは、.Net DateTime タイプの値を提供します。TransDate 列は、@StartDate および @EndDate パラメーターと同様に、Sql Server DateTime 型である必要があります。これらを文字列として表現する必要はありませんそれらは常に人間が読めないバイナリ形式である必要があります。これを行った場合、書かれた選択クエリは必要なことを行うはずです。

これがどのように機能するかの例 (C#、必要に応じて VB を実行できます) を次に示します。

//imaginary function to check if there's at least one record in the data range
bool CheckDates(DateTime startDate, DateTime endDate)
{
    //sql is unchanged from your question
    string sql = "Select * from tblSomething Where TransDate >=  @StartDate  AND TransDate <= @EndDate";

     using (var cn = new SqlConnection("connection string here"))
     using (var cmd = new SqlCommand(sql))
     {
        cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
        cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;

        cn.Open()
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
           //all we care is whether there's at least one row
           // there is a row if and only if .Read() succeeds
           return rdr.Read();
        }
    }
}

次のように呼び出すことができます。

//hopefully you picked better control names :)
if (CheckDates(dateTimePicker1.Value, dateTimePicker2.Value))
{
   //do something
}

重要なことは、その DateTime を文字列に変換することは決してないということです。

于 2013-05-15T16:58:38.580 に答える