【发布时间】: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