1

私はこのSQLServerクエリを返していますConversion failed when converting date and/or time from character string.

(
    @numberRecords int,
    @date varchar(12)
)

AS
SET ROWCOUNT @numberRecords
SELECT re.ID, re.RecentChangeTypeID, re.LogID, re.RevisionID
FROM RecentChanges re
    FULL OUTER JOIN Revisions rev
        ON re.RevisionID = rev.ID
    FULL OUTER JOIN Logs lg
        ON re.LogID = lg.ID
WHERE convert(datetime, rev.Timestamp) >= '@date' OR
      convert(datetime, lg.Timestamp) >= '@date';
RETURN

このdateパラメーターは、「dd-MM-yyyy」の形式で文字列値を返します。原因は何でしょうか?

4

3 に答える 3

4

パラメータを一重引用符で囲まないでください@date。パラメータではなく文字列として解釈されます。

'@date'書かれているように、あなたはdatetime解析しないものを作ろうとしています。

そうは言ってもdatetime、最初に入力パラメータをaにする必要があります。

于 2012-05-04T18:37:18.767 に答える
1

クエリを機能させるために@JNKが説明したように、一重引用符を削除します。ただし、パフォーマンス(インデックスの使用法)を大幅に向上させるには、このクエリを試してください(列にインデックスがありRevisions.TimestampLogs.Timestamp):

SELECT 
    re.ID, re.RecentChangeTypeID, re.LogID, re.RevisionID
FROM RecentChanges         re
    INNER JOIN Revisions   rev ON re.RevisionID = rev.ID
WHERE rev.Timestamp >= @date
UNION
SELECT 
    re.ID, re.RecentChangeTypeID, re.LogID, re.RevisionID
FROM RecentChanges    re
    INNER JOIN Logs   lg ON re.LogID = lg.ID
WHERE lg.Timestamp >= @date
于 2012-05-04T18:53:49.180 に答える
0

一見すると、日時からではなく、日時に変換しているように見えます。私はrev.Timestampがすでに日時であると想定していますが、@ dateはvarchar(12)です...したがって、SQLServerは日時を文字列と比較できないと文句を言っています...

于 2012-05-04T18:34:04.017 に答える