【问题标题】:SQL Between day and month (No Year) related with ReaccurranceSQL between day and month (No Year) 与 Reaccurrance 相关
【发布时间】:2016-01-14 04:38:11
【问题描述】:

对不起, 这是我的应用程序:

数据库设计:

所以,规则是当重复出现时,所以我看的不是年份,而是月份和日期。 到目前为止,这是我的查询,但是当我尝试时,当开始日期在 12 月和结束日期在明年 1 月时它仍然失败......

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)
            )

在这部分,应该过滤重复,无论年份,只是在日和月之间。所以,如果我输入 2017 年 1 月 1 日,com_holiday_id = 2,应该会出现“Natal dan tahun baru”,但这并不是因为我的日期转换器仍然在窃听,当我尝试过滤年末时,直到明年的某些日子,当我尝试得到它显示的sql结果:2017-12-25直到2017-01-02。 也许有办法解决这个问题,也许是 sql server 内置功能?

  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)
            )

还有其他方法可以解决这个问题吗?介于一天和一个月之间?

【问题讨论】:

  • 考虑为两个日期列 AS DATEADD(YEAR, DATEDIFF(YEAR, 0, col_name), 0) 中的每一个计算列 - 然后这些计算列都将 1900 作为年份,您也可以将变量设置为 1900。
  • 不明白,请多解释。我的意思是 COM_HOLIDAY_ID RECURRANCE START_HOLIDAY_DATE END_HOLIDAY_DATE 2 1 2015-12-25 00:00:00.000 2016-01-02 00:00:00.000 HOLIDAY_NAME Natal dan Tahun Baru 应该出现在过滤器中,但我尝试使用 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)
  • Reaccurrance 表示每年都会设置

标签: sql-server


【解决方案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
        )
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2010-09-07
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多