Tsql VarChar implizit zu Smalldatetime
-
21-08-2019 - |
Frage
Wenn die Ausführung folgende Verwendung eine small Einschränkung für die zurückgegebenen Ergebnisse, bekomme ich null Ergebnisse:
Execute sp_proc @DateOfBirth = '01/01/1900'
oder
Execute sp_proc @DateOfBirth = '1900-01-01'
Aber wenn die folgende varchar Argument all die plötzliche i Ergebnisse zu erhalten, die auf 1. Januar 2000 entsprechen Hat small implizite Konvertierung für nicht arbeiten mm / tt / Termine und nur mm / tt / jj Daten?
Execute sp_proc @DateOfBirth = '01/01/00'
Das gibt alle Ergebnisse für 01/01/2000 Geburtstage!
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)
Lösung
"01/01/00" umgewandelt wird auf der Grundlage des " zweistelliges Jahr Cutoff " Option. So wird es 1. Januar 2000.
Wenn Sie ‚1900-01-01‘ senden, dann wird Ihr Code zeigt Ihnen nur die Ergebnisse erhalten, wenn Sie DOB = 1. JANUAR 1900.
Other than that, es funktioniert wie beworben.
Es sei denn, Sie Execute sp_proc @DateOfBirth = DEFAULT
ausführen möchten DOB zwingen, um ignoriert werden
Andere Tipps
Technisch sollten Sie die Ausgabe werden zu vergleichen:
Execute sp_proc @DateOfBirth = '01/01/00'
zu:
Execute sp_proc @DateOfBirth = '01/01/2000'
oder
Execute sp_proc @DateOfBirth = '2000-01-01'
verwenden, um ein sicheres Format wie YYYYMMDD (keine Striche)
laufen diese auch, um zu sehen, was passiert,
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)