2009-03-03 6 views
1

J'ai des enregistrements d'événements avec des heures de début et de fin pour un contrôle de calendrier.Problème arithmétique de date sqlserver

Je veux obtenir les événements fait à une date donnée dire 2/28/2009

Mais la table db a des données de date sous forme 28/02/2009 10:00:00, 28/02/2009 12:00:00

J'ai essayé cette requête dans un sproc créé dans VS 2005 IDE, mais cela n'a pas fonctionné

ALTER PROCEDURE dbo.spSelectBenchEvent 
( 
@EVENT_DATE DATE // BTW, THIS RETURNS ERROR :CANNOT FIND DATE DATATYPE. 
       //@EVENT_DATE HAS INVALID DATATYPE 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT  ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
    FROM   tbl_benchbook 
    WHERE START_TIME=EVENT_DATE 
    ORDER BY START_TIME 

Merci à l'avance.

+0

il n'y a que des types de données datetime et smalldatetime relatifs à ce jour. Utilisez-les ou utilisez event_date comme varchar. – Learning

+0

A propos de l'erreur de type de données. Vous devez changer la date en datetime si vous utilisez SQLServer2005 ou plus tôt – kristof

Répondre

2

Il y avait de nombreuses questions liées à celui-ci, consultez:

et pour le meilleur contrôle de solution sage performance: MS SQL Date Only Without Time

Fondamentalement, votre code pourrait ressembler à:

select  
    id, eid, benchid, paccode, start_time, end_time 
from 
    tbl_benchbook 
where start_time >= dateadd(dd, datediff(dd, 0, @event_date), 0) 
and start_time < dateadd(dd, datediff(dd, 0, @event_date)+1, 0) 
2

Si vous souhaitez évaluer tous les événements à la date du 29/03/2009, utilisez le tableau suivant.

SELECT * 
FROM tableName 
WHERE Date >= '2009/03/29' AND Date < '2009/03/30' 

Le point clé à emporter est ici que pour capturer tous les dossiers qui se sont produits à une date donnée, vous devez définir une plage de dates qui inclut toutes les valeurs de temps pour ce jour-là.

Avez-vous du sens?

Cheers, John

+0

+1 pour la méthode qui utilise la couverture d'index – Learning

+0

btw: juste remarqué que ce serait vraiment un bon mois s'il avait 30 jours :) – Learning

+0

Avec cette méthode, vous avez évidemment ne peut pas simplement ajouter un jour à la partie jour de la date :) – cjk

2

Sur la base de vos mises à jour ques, cela devrait fonctionner:

SELECT ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
    FROM tbl_benchbook 
    WHERE START_TIME >= @EVENT_DATE 
    AND  START_TIME < DATEADD(day,1,@EVENT_DATE) 
    ORDER BY START_TIME 
+0

Beaucoup plus clair, mais vous prendrez les heures de début avec un minuit le lendemain ("entre" est inclusif). Je pense que vous aurez besoin de> = et <. Vous aurez également besoin de @EVENT_DATE, pas de EVENT_DATE. – Hobo

+0

@All, j'ai un nouveau problème, la date n'est pas reconnue comme un type de données valide. –

+0

@Hobo: Bonne prise! Je vais mettre à jour. – Learning

-1
--1. you need to make sure there is no time on the parameter 
--2. you can just use "+1" on the datetime, to get the next day 



    enter ALTER PROCEDURE dbo.spSelectBenchEvent 
    ( 
    @EVENT_DATE DATETIME 
    ) 
    AS 
    BEGIN TRAN 
    SET NOCOUNT ON; 

    --remove any time from given date 
    SET @EVENT_DATE=CONVERT(char(10),@EVENT_DATE,111) 


    SELECT  ID, EID, BENCHID, PACCODE, START_TIME, END_TIME 
      FROM   tbl_benchbook 
      WHERE START_TIME>[email protected]_DATE AND START_TIME<@EVENT_DATE+1 
      ORDER BY START_TIME 
    code here 
+0

Passer une date (numérique) à un caractère est beaucoup plus lent que de simplement le laisser numérique. – StingyJack

+0

il convertit seulement une fois, à peine un tueur de cpu! –