質問

返された結果に対して smalldatetime 制約を使用して以下を実行すると、結果はゼロになります。

Execute sp_proc @DateOfBirth =   '01/01/1900' 

または

Execute sp_proc @DateOfBirth =   '1900-01-01' 

しかし、次の varchar 引数を使用すると、突然 2000 年 1 月 1 日に対応する結果が得られます。smalldatetime の暗黙的な変換は mm/dd/YYYY 日付では機能せず、mm/dd/YY 日付のみでは機能しませんか?

Execute sp_proc @DateOfBirth =   '01/01/00' 

これにより、2000 年 1 月 1 日の誕生日に関するすべての結果が返されます。

CREATE PROCEDURE [dbo].[sp_proc] 
    -- Add the parameters for the stored procedure here

    @DateOfBirth SmallDateTime = null 

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT *
    FROM
        view_People
    WHERE
        FirstName LIKE '%' + IsNull(@FName ,FirstName) + '%'
    AND
        LastName LIKE '%' + IsNull(@LName,LastName) + '%'
    AND
        DOB = IsNull(@DateOfBirth,DOB) 
    AND
        SSN = IsNull(@SSN,SSN)
役に立ちましたか?

解決

「01/01/00」は「」に基づいて変換されます。2 桁の年区切り" オプション。したがって、2000 年 1 月 1 日になります。

「1900-01-01」を送信すると、コードは DOB = 01 Jan 1900 の場合にのみ結果を取得することを示します。

それ以外は、宣伝どおりに機能しています。走りたくなければ Execute sp_proc @DateOfBirth = DEFAULT DOB を強制的に無視するには

他のヒント

技術的には、次の出力を比較する必要があります。

Execute sp_proc @DateOfBirth =   '01/01/00'

に:

Execute sp_proc @DateOfBirth =   '01/01/2000'

または

Execute sp_proc @DateOfBirth =   '2000-01-01'

YYYYMMDD (ダッシュなし) のような安全な形式を使用してください

これらも実行して何が起こるかを確認してください

select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top