关于拼凑的字符串转换为日期的问题

lovebaby 2013-06-28 04:58:52
先放上我的存储过程代码:


/****** 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块来处理一下,但好象不行。

不知道应该怎样去处理一下。
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaITOldMan 2013-06-28
  • 打赏
  • 举报
回复
yes,参考楼上的
唐诗三百首 2013-06-28
  • 打赏
  • 举报
回复
可以先用ISDATE()函数判断日期是否合法.. 参考 http://msdn.microsoft.com/zh-cn/library/ms187347(v=sql.105).aspx
lovebaby 2013-06-28
  • 打赏
  • 举报
回复
你的意思我明白,我也想保存一个日期,但实际需求不是这样的。实际的需求是,让用户选择输入一个只有月和日的日期,年份对于用户来说没有意义。系统需要在用户设定的日期前几天内进行提醒。 即使让用户选择输入了年份,比如生日,如:2004-02-29,我实际需要的只是02-29,实际还是会有问题的。
shoppo0505 2013-06-28
  • 打赏
  • 举报
回复
这个问题的问题是你没有完全保存日期信息。

建议在数据保存的时候就要求保存完整的日期信息。

你现在是吃力不讨好。直接保存一个日期字段好了,方便又简单。
lovebaby 2013-06-28
  • 打赏
  • 举报
回复
如果不能在SQL中进行判断,那就只能把所有的日期统一为2月28日了。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧