2016-01-14 3 views
1

Извините, Это мое приложение:SQL Между день и месяц (Нет год), связанных с Reaccurrance

Repeatable

дБ Конструкция:

design

Таким образом, правило когда я повторяюсь, поэтому я не вижу год только месяц и день. До сих пор это мой запрос, но когда я пытаюсь, он все еще не удалось, когда дата начала в декабре и дата окончания в январе следующего года ...

result

ALTER PROC [dbo].[uspPFS_HolidayListWithDateOrWithUnionReaccurrance] (
    @p_sKeyword VARCHAR(255) = NULL 
    ,@p_dtStartHolidayDateFrom DATETIME = NULL 
    ,@p_dtEndHolidayDateTo DATETIME = NULL 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 
     AND (
      @p_dtStartHolidayDateFrom IS NULL 
      OR @p_dtStartHolidayDateFrom BETWEEN [START_HOLIDAY_DATE] 
       AND [END_HOLIDAY_DATE] 
      ) 

    UNION 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 
     AND (
      @p_dtEndHolidayDateTo IS NULL 
      OR @p_dtEndHolidayDateTo BETWEEN [START_HOLIDAY_DATE] 
       AND [END_HOLIDAY_DATE] 
      ) 

    UNION 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 
     AND (
      @p_dtStartHolidayDateFrom IS NULL 
      OR [START_HOLIDAY_DATE] >= @p_dtStartHolidayDateFrom 
      ) 
     AND (
      @p_dtEndHolidayDateTo IS NULL 
      OR [END_HOLIDAY_DATE] < DATEADD(DAY, 1, @p_dtEndHolidayDateTo) 
      ) 

    UNION 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE RECURRANCE = 1 
     AND (
      @p_dtStartHolidayDateFrom IS NULL 
      OR @p_dtStartHolidayDateFrom BETWEEN CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtStartHolidayDateFrom)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, START_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, START_HOLIDAY_DATE)) AS DATETIME) 
       AND DATEADD(DAY, 1, CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtStartHolidayDateFrom)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, END_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, END_HOLIDAY_DATE)) AS DATETIME)) 
      ) 
     AND (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 

    UNION 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE RECURRANCE = 1 
     AND (
      @p_dtEndHolidayDateTo IS NULL 
      OR @p_dtEndHolidayDateTo BETWEEN CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtEndHolidayDateTo)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, START_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, START_HOLIDAY_DATE)) AS DATETIME) 
       AND DATEADD(DAY, 1, CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtEndHolidayDateTo)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, END_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, END_HOLIDAY_DATE)) AS DATETIME)) 
      ) 
     AND (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 

    UNION 

    SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE RECURRANCE = 1 
     AND (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 
     AND (
      @p_dtStartHolidayDateFrom IS NULL 
      OR CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtStartHolidayDateFrom)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, START_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, START_HOLIDAY_DATE)) AS DATETIME) >= @p_dtStartHolidayDateFrom 
      ) 
     AND (
      @p_dtEndHolidayDateTo IS NULL 
      OR CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtEndHolidayDateTo)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, END_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, END_HOLIDAY_DATE)) AS DATETIME) < DATEADD(DAY, 1, @p_dtEndHolidayDateTo) 
      ) 

по этой части, должны повторять фильтрацию независимо от года, только между днем ​​и месяцем. Итак, если я ввожу 01 января 2017 года, com_holiday_id = 2, должен появиться «Natal dan tahun baru», но с тех пор, как мой преобразователь даты все еще прослушивался, когда пытаюсь отфильтровать конец года до нескольких дней в следующем году, когда я пытаюсь получить результат sql, который показывает: 2017-12-25 до 2017-01-02. Может быть, есть способ решить этот, возможно, встроенный в sql-сервер?

SELECT [COM_HOLIDAY_ID] 
     ,[RECURRANCE] 
     ,[START_HOLIDAY_DATE] 
     ,[END_HOLIDAY_DATE] 
     ,[HOLIDAY_NAME] 
     ,[HOLIDAY_DESC] 
     ,[CREATE_BY_USER_ID] 
     ,[UPDATE_BY_USER_ID] 
     ,[CREATE_DATE] 
     ,[UPDATE_DATE] 
    FROM [PFS_HOLIDAY] WITH (NOLOCK) 
    WHERE RECURRANCE = 1 
     AND (
      @p_sKeyword IS NULL 
      OR [HOLIDAY_NAME] LIKE '%' + @p_sKeyword + '%' 
      OR [HOLIDAY_DESC] LIKE '%' + @p_sKeyword + '%' 
      ) 
     AND (
      @p_dtStartHolidayDateFrom IS NULL 
      OR CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtStartHolidayDateFrom)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, START_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, START_HOLIDAY_DATE)) AS DATETIME) >= @p_dtStartHolidayDateFrom 
      ) 
     AND (
      @p_dtEndHolidayDateTo IS NULL 
      OR CAST(CONVERT(VARCHAR(10), DATEPART(yyyy, @p_dtEndHolidayDateTo)) + '-' + CONVERT(VARCHAR(10), DATEPART(mm, END_HOLIDAY_DATE)) + '-' + CONVERT(VARCHAR(10), DATEPART(dd, END_HOLIDAY_DATE)) AS DATETIME) < DATEADD(DAY, 1, @p_dtEndHolidayDateTo) 
      ) 

Есть ли другой способ решить этот случай? Что-то вроде дня и месяца?

+0

Рассмотрим вычисляемый столбец для каждого из двух столбцов дат 'AS DATEADD (год, DATEDIFF (год, 0, col_name), 0)' - то эти вычисляемые столбцы будут иметь 1900 как год, и вы можете установить свою переменную на 1900. –

+0

Не понимаю, Пожалуйста, объясните больше. Я имею в виду COM_HOLIDAY_ID \t \t RECURRANCE START_HOLIDAY_DATE \t END_HOLIDAY_DATE 2015-12-25 00: 00: 00,000 \t 2016-01-02 00: 00: 00,000 HOLIDAY_NAME Natal дана Tahun Бару должен появляться в фильтре, но Я пытаюсь использовать CAST (CONVERT (VARCHAR (10), DATEPART (yyyy, @p_dtEndHolidayDateTo)) + '-' + CONVERT (VARCHAR (10), DATEPART (mm, END_HOLIDAY_DATE)) + '-' + CONVERT (VARCHAR (10) , DATEPART (dd, END_HOLIDAY_DATE)) AS DATETIME) toha

+0

Реагивация означает, что он будет установлен каждый год – toha

ответ

1

Попробуйте это:

select * 
from [PFS_HOLIDAY] with (NOLOCK) 
where 
    ([HOLIDAY_NAME] like '%' + isnull(@p_sKeyword,'') + '%' OR [HOLIDAY_DESC] LIKE '%' + isnull(@p_sKeyword,'') + '%') and 
    (
     (
      -- compare start date 
      case 
       when RECURRANCE = 1 then 
        cast(year(@p_dtStartHolidayDateFrom) as nvarchar(4)) + cast(month(START_HOLIDAY_DATE) as nvarchar(2)) + cast(day(START_HOLIDAY_DATE) as nvarchar(2)) 
       else 
        START_HOLIDAY_DATE     
      end >= @p_dtStartHolidayDateFrom 
     ) 
     and 
     (
      -- compare end date 
      case 
       when RECURRANCE = 1 then 
        cast(year(@p_dtEndHolidayDateTo) as nvarchar(4)) + cast(month(END_HOLIDAY_DATE) as nvarchar(2)) + cast(day(END_HOLIDAY_DATE) as nvarchar(2)) 
       else 
        END_HOLIDAY_DATE      
      end <= @p_dtEndHolidayDateTo 
     ) 
    ) 
Смежные вопросы