to_date в SQL Server 2005 - PullRequest
       11

to_date в SQL Server 2005

1 голос
/ 03 апреля 2010

Кто-нибудь знает, как мне пришлось бы изменить следующее для работы с MS SQL?

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 ]

2 голосов
/ 03 апреля 2010

Использование:

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

... но, как указал gbn, для обеспечения безопасности на местном уровне - используйте:

WHERE registrationdate BETWEEN '20030101' AND '20031231'

SQL Server будет выполнять неявное преобразование строки в дату при условии, что это поддерживаемый формат. Явное преобразование - это когда вы должны использовать CAST или CONVERT для изменения типа данных.

При преобразовании '01/01/2003' в DATETIME часть времени будет 00:00:00, поскольку она не была указана.

1 голос
/ 27 февраля 2013
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...