2010-04-03 138 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