2010-04-03 121 views
1

是否有人知道我将不得不改变以下使用ms sql?to_date在SQL Server 2005中

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

我已阅读意味着我将有它使用DATEPART建设(),它会变得非常长篇大论。特别是当我的目标是比较我收到的日期,格式为“2003-12-30 10:07:42”。将它们按原样传递给数据库将会很好。

任何指针赞赏。

回答

2

用途:

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

...但GBN指出,要成为区域安全 - 使用:

WHERE registrationdate BETWEEN '20030101' AND '20031231' 

SQL Server将执行字符串隐式转换为日期,提供它是一种支持的格式。显式转换是当您必须使用CAST or CONVERT来更改数据类型时。

将'01/01/2003'转换为DATETIME时,时间部分将为00:00:00,因为它没有被指定。

+0

那是节省了我的时间堆,Muchus格拉西亚斯 – Chin 2010-04-03 02:35:37

+1

@Chin当心你的优势的情况下为上面的代码不会与它“2003-12-31 10点07分42秒”返回的记录。没有时间,它被假定为0:00:00。你可能想使用'01/01/2004'或'12/31/2003 23:59:59' – SqlACID 2010-04-03 02:49:12

+2

使用明确的格式'CONVERT(datetime,'01/01/2003',103)''会为你节省一个很多潜在的问题。 – erikkallen 2010-04-03 09:26:02

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