Verfahren zur Überprüfung des Jahrestermins

Ich versuche, ein Verfahren zu erstellen, um die jährlichen data zu überprüfen. Das date wird einmal in der BD gespeichert, aber im Kalender auf meiner Winform zeigt es jährlich (ich verwende jährlich fettgedruckte Termine in C #). Also, was ich mit der Abfrage machen will, ist zu überprüfen ist der Monat und der Tag sind wie das date in der Tabelle gespeichert, aber funktioniert nicht. Das ist meine Frage:

SELECT IdCalendar, Description, DateCalendar, Annualy FROM Calendar WHERE (DATEPART(MONTH,DateCalendar) like DATEPART(MONTH,@DateCalendar)) AND (DATEPART(DAY,DateCalendar) like DATEPART(DAY,@DateCalendar)) 

Und zum Beispiel ist mein gespeicherter DateCalendar '2015-12-04', und ich mein paramenter @DateCalendar ist '2016-12-04'. Irgendeine Idee, wie man eine bessere Abfrage macht?

BEARBEITEN

Die Abfrage hat keinen Fehler oder Warnung. Gibt einfach 0 Zeilen zurück. Und mein DateCalendar ist als DateTime gespeichert.

Die SP:

 CREATE PROC [dbo].[usp_app_Calendar_Search] @DateCalendar DATETIME, @Result SMALLINT OUTPUT, @Message VARCHAR(1000) OUTPUT AS BEGIN DECLARE @vResult SMALLINT, @vMessage VARCHAR(1000) SELECT @vResult = 0, @vMessage = '' BEGIN TRY IF EXISTS (SELECT * FROM Calendar WHERE DateCalendar = @DateCalendar) BEGIN IF(@DateCalendar = 0) SET @DateCalendar = NULL SELECT IdCalendar, Description, DateCalendar, Annualy FROM Calendar WHERE (DATEPART(MONTH,DateCalendar) like DATEPART(MONTH,@DateCalendar)) AND (DATEPART(DAY,DateCalendar) like DATEPART(DAY,@DateCalendar)) SET @vResult = 1 SET @vMessage = 'Done' END ELSE BEGIN SET @vResult = 0 SET @vMessage = 'Error.' END END TRY BEGIN CATCH SET @vResult = -1 SET @vMessage = 'Error: ' + ERROR_MESSAGE() + ' Line: ' + CAST(ERROR_LINE() AS VARCHAR) END CATCH SELECT @Result = @vResult, @Message = @vMessage END 

Danke im Voraus.

Das Problem ist mit IF EXISTS (SELECT * FROM Calendar WHERE DateCalendar = @DateCalendar) . Ich schreibe dein SP:

 CREATE PROC [dbo].[usp_app_Calendar_Search] @DateCalendar DATETIME, @Result SMALLINT OUTPUT, @Message VARCHAR(1000) OUTPUT AS BEGIN DECLARE @vResult SMALLINT = 0 ,@vMessage VARCHAR(1000) = ''; IF(@DateCalendar = 0) SET @DateCalendar = NULL; BEGIN TRY SELECT IdCalendar, Description, DateCalendar, Annualy FROM Calendar WHERE DATEPART(MONTH,DateCalendar) = DATEPART(MONTH,@DateCalendar) AND DATEPART(DAY,DateCalendar) = DATEPART(DAY,@DateCalendar); IF @@ROWCOUNT > 0 SELECT @vResult = 1, @vMessage = 'Done' ELSE SELECT @vResult = 0, @vMessage = 'Error.'; END TRY BEGIN CATCH SET @vResult = -1 SET @vMessage = 'Error: ' + ERROR_MESSAGE() + ' Line: ' + CAST(ERROR_LINE() AS VARCHAR) END CATCH SELECT @Result = @vResult, @Message = @vMessage; END 

BEARBEITEN:

Nun ist die WHERE Bedingung nicht-SARGable, also bedeutet das, dass der Abfrageoptimierer den Index auf der DateCalendar Spalte überspringt (falls vorhanden).

Sie können berechnete Spalten wie @Tom Seite vorgeschlagen in Kommentar:

 ALTER TABLE Calendar ADD MonthCalendar AS DATEPART(MONTH,DateCalendar); ALTER TABLE Calendar ADD DayCalendar AS DATEPART(day,DateCalendar); /*Create Index on Calculated Columns for Month and day*/ CREATE INDEX IX_Calendar_Month_Day ON Calendar(MonthCalendar , DayCalendar); /*Use Computed Column Index in W*/ DECLARE @DateCalendar datetime = '2015-12-25'; SELECT IdCalendar, Description, DateCalendar, Annualy FROM Calendar WHERE MonthCalendar = DATEPART(MONTH,@DateCalendar) AND DayCalendar = DATEPART(DAY,@DateCalenda);