日期:2014-05-17  浏览次数:20387 次

关于拼凑的字符串转换为日期的问题
先放上我的存储过程代码:


/****** Object:  StoredProcedure [dbo].[Pro_spa_GETSendUser]    Script Date: 06/28/2013 16:51:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[Pro_spa_GETSendUser]
(
@DiffDay int,
@FestivalIDLIST NVARCHAR(1000) OUT
)
AS
DECLARE @COUNT1 int
--查找与截止日期天数相等的所用待发用户数并赋值
SELECT @COUNT1 = COUNT(*)
FROM [spa_UserFestival]
WHERE DATEDIFF(D,GETDATE(),CONVERT(datetime2,CONVERT(nvarchar,YEAR(getdate()))+ FestivalMonth + FestivalDay)) = @DiffDay
--如果数量大于0,则循环游标,查找有没有已经发送过的短信,如果没有找到,则进行发送
IF @COUNT1 > 0
DECLARE @UserID int
DECLARE @FestivalID INT
DECLARE @FestivalIDLIST_Temp NVARCHAR(1000) = ''
--游标
DECLARE vend_cursor CURSOR LOCAL SCROLL
    FOR SELECT FestivalID,UserID FROM spa_UserFestival
WHERE DATEDIFF(D,GETDATE(),CONVERT(datetime2,CONVERT(nvarchar,YEAR(getdate()))+ FestivalMonth + FestivalDay)) = @DiffDay
OPEN vend_cursor

FETCH NEXT FROM vend_cursor INTO @FestivalID,@UserID
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @FestivalID
--执行检查,看是否已经发送过短信
DECLARE @Count2 INT
SELECT @Count2 = COUNT(*) FROM spa_SendMsg
WHERE UserID = @UserID AND FestivalID = @FestivalID AND FestivalType = 1
IF @Count2 <= 0
BEGIN
SET @FestivalIDLIST_Temp = @FestivalIDLIST_Temp + CONVERT(nvarchar,@FestivalID) + ','
END
FETCH NEXT FROM vend_cursor INTO @FestivalID,@UserID
END

CLOSE vend_cursor
DEALLOCATE vend_cursor
SET @FestivalIDLIST = @FestivalIDLIST_Temp

GO


描述:
我先从spa_UserFestival表里查出满足相关天数的记录,然后再到另一张表里查找有没有相关的记录,最后返回一个逗号分隔的ID列表。

因为用户输入不会选择年份,只会选择月份和日期,这样一来就没办法判断日期的合法性了,有规律的1\3\5\7\8\10\12这种月份还好说,2月份只能和当前年份加在一起才能判断。
我在spa_UserFestival只设置了FestivalMonth和FestivalDay两个字段用来存储用户选择的月份和日期,然后加上当前年的年份,再进行日期转换。
问题:
还是2月份天数的问题,如果用户选择的是2月29日,再加上今年的年份,肯定会出错,因为今年是没有29日的,我想用TRY CATCH块来处理一下,但好象不行。

不知道应该怎样去处理一下。