1

「varchar データ型を datetime データ型に変換した結果、範囲外の値が発生しました。」というエラーが表示されます。日付形式は「DD/MM/YY」です

    public DataSet GetSynchronizeDataForDLDocs(string date_pushed)
{
    DataSet ds = new DataSet();
    string strQuery=string.Empty;

    if (date_pushed != null && date_pushed != string.Empty)                 // 105
         strQuery = 
            @"select 
                a.DLNO,
                a.NAME,
                b.TOPSTRING,
                Convert(datetime,a.DOB,103) as DOB,
                Convert(datetime,a.DOI,103) as DOI,
                Convert(datetime,b.datepushed,103) as datepushed 
            from 
                PLInfo_Demo a,
                DLInfo_Demo b 
            where 
                a.dlno=b.dlno 
            and
                Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103)
            and 
                DATEPART(hh, b.datepushed) > Datepart(hh,'" + date_pushed + @"') 
            and
                DATEPART(MI, b.datepushed) > Datepart(MI,'" + date_pushed + @"' ) 
            and
                DATEPART(ss, b.datepushed) > Datepart(ss,'" + date_pushed + @"' ) 
            order by b.datepushed desc";
    else
         strQuery = @"
            select 
                a.DLNO,
                a.NAME,
                b.TOPSTRING,
                Convert(datetime,a.DOB,103) as DOB,
                Convert(datetime,a.DOI,103) as DOI,
                Convert(datetime,b.datepushed,103) as datepushed 
            from 
                PLInfo_Demo a,
                DLInfo_Demo b
            where 
                a.dlno=b.dlno ";
    ds = DbManager.ExecuteSalarData(
        strQuery, 
        CommandType.Text, 
        DbManager.strcon2, 
        null);

    return ds;
}
4

3 に答える 3

4

最初のことは、 string として渡さないdate_pushedことです。あなたのC#(DateTime.Parseまたは同様の、おそらくフォーマットとカルチャを指定する)でそれを解析し、それをパラメーターとして渡します。あなたが持っているすべての場所で、代わり'" + date_pushed + '"'に使用してください。@theParameter

b.datepushed次はa として保存することです- ondatetimeを使用する必要はありません。文字列の場合は、間違っていますconvertb.datepushed

その後、datetimeフィールドをdatetimeパラメーターと比較しますが、これは問題なく機能します。例えば:

and Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103)

になる

and b.datepushed > @date_pushed

はフィールド、はb.datepushedパラメータです。もちろん、etc を a で使用できます。重要な点は、何も解析していないことです。datetime@date_pusheddatetimeDATEPARTdatetime

于 2012-05-04T06:36:15.317 に答える
0

これらのいくつかは失敗したに違いないので、実際の値を見てください:

Convert(datetime,a.DOB,103) as DOB,
Convert(datetime,a.DOI,103) as DOI,
Convert(datetime,b.datepushed,103) as datepushed 
于 2012-05-04T06:37:30.797 に答える
0

SQL Server を使用していると仮定します。

datetime (Transact-SQL) MSDN ページに記載されているように、SQL Server の有効な datetime 範囲は1753 年 1 月 1日から9999 年 12 月 31 日です。

convert(datetime, ...)この範囲外の値については、すべてのステートメントに注意することをお勧めします。

于 2012-05-04T06:37:39.617 に答える