2010-04-03 7 views
1

Est-ce que quelqu'un sait comment je devrais changer ce qui suit pour travailler avec ms sql?to_date dans SQL Server 2005

WHERE registrationDate between to_date ('2003/01/01', 'yyyy/mm/dd') 
AND to_date ('2003/12/31', 'yyyy/mm/dd'); 

Ce que j'ai lu implique que je dois le construire en utilisant DATEPART() qui pourrait devenir très longue haleine. Surtout quand l'objectif serait de comparer les dates que je reçois dans le format suivant "2003-12-30 10:07:42". Ce serait bien de les transmettre à la base de données en l'état.

N'importe quel pointeur apprécié.

Répondre

2

Utilisation:

WHERE registrationdate BETWEEN '01/01/2003' AND '12/31/2003' 

... mais comme GBN a souligné, pour être locale en toute sécurité - utilisation:

WHERE registrationdate BETWEEN '20030101' AND '20031231' 

SQL Server effectue une conversion implicite de la chaîne en date, fournissant c'est un format supporté. La conversion explicite est lorsque vous devez utiliser CAST or CONVERT pour modifier le type de données.

Lors de la conversion de '01/01/2003 'en DATETIME, la partie heure sera 00:00:00 car elle n'a pas été spécifiée.

+0

Thats me sauve un tas de temps, Muchus gracias – Chin

+1

@Chin méfiez-vous de vos affaires de pointe que le code ci-dessus ne retournerait pas un record avec « 2003-12-31 10:07:42 » en elle. En l'absence de temps, il est supposé être 0:00:00. Vous pouvez utiliser '01/01/2004 'ou '12/31/2003 23:59:59' – SqlACID

+2

En utilisant un format explicite 'CONVERT (datetime, '01/01/2003 ', 103)' vous sauvera un beaucoup de problèmes potentiels. – erikkallen

0
CREATE FUNCTION [DBO].[to_date](@P_FORMAT VARCHAR(30), 
           @P_STRING VARCHAR(30)) 
RETURNS DATETIME 
AS 
    BEGIN 
     DECLARE @V_DAY INT 
     DECLARE @V_MONTH INT 
     DECLARE @V_YEAR INT 
     DECLARE @V_HOUR INT 
     DECLARE @V_MINUTE INT 
     DECLARE @V_SECOND INT 
     DECLARE @V_DATETIME DATETIME 

     SET @V_DAY = charindex('dd', @P_FORMAT) 
     SET @V_MONTH = charindex('mm', @P_FORMAT) 
     SET @V_YEAR = charindex('yyyy', @P_FORMAT) 
     SET @V_HOUR = charindex('hh', @P_FORMAT); 
     SET @V_MINUTE = charindex('nn', @P_FORMAT); 
     SET @V_SECOND = charindex('ss', @P_FORMAT); 

     IF @V_DAY = 0 
     SET @V_DAY=1 
     ELSE 
     SET @V_DAY=CONVERT(INT, substring(@P_STRING, @V_DAY, 2)); 

     IF @V_MONTH = 0 
     SET @V_MONTH=1 
     ELSE 
     SET @V_MONTH=CONVERT(INT, substring(@P_STRING, @V_MONTH, 2)); 

     IF @V_YEAR = 0 
     SET @V_YEAR=2000 
     ELSE 
     SET @V_YEAR=CONVERT(INT, substring(@P_STRING, @V_YEAR, 4)); 

     IF @V_HOUR = 0 
     SET @V_HOUR=0 
     ELSE 
     SET @V_HOUR=CONVERT(INT, substring(@P_STRING, @V_HOUR, 2)); 

     IF @V_MINUTE = 0 
     SET @V_MINUTE=0 
     ELSE 
     SET @V_MINUTE=CONVERT(INT, substring(@P_STRING, @V_MINUTE, 2)); 

     IF @V_SECOND = 0 
     SET @V_SECOND=0 
     ELSE 
     SET @V_SECOND=CONVERT(INT, substring(@P_STRING, @V_SECOND, 2)); 

     SET @V_DATETIME=CONVERT(DATETIME, cast(@V_YEAR AS VARCHAR) + '-' 
             + cast(@V_MONTH AS VARCHAR) + '-' 
             + cast(@V_DAY AS VARCHAR) + ' ' 
             + cast(@V_HOUR AS VARCHAR) + ':' 
             + cast(@V_MINUTE AS VARCHAR) + ':' 
             + cast(@V_SECOND AS VARCHAR), 120); 

     RETURN @V_DATETIME; 
    END