求教如何处理非法日期,例如2月30号

stbigcrab 2007-07-12 11:28:20
有一个字符串
例如2005-02-30
如果用SQL语句检查后,自动恢复正确的日期2005-02-28或润月2005-02-29日
...全文
1593 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
PCI_E 2007-07-17
  • 打赏
  • 举报
回复
楼主的这个想法有点不和逻辑,如果日期格式不对的话,就应该是说明填写表单的人对日期填错了,如果靠电脑自动转换,也许转化的日期并非填写者所期望的日期啊!!所以对日期表达式是否有效的判断,应该在前台就进行判断了,其实写个 正则表达式 就可以很好的解决这个问题
bootupnow 2007-07-15
  • 打赏
  • 举报
回复
ljsql(第 1 行: '脑子' 附近有语法错误。)很有想法,利用系统的自动转化功能来实现,哈哈,强了!
fu320212253 2007-07-14
  • 打赏
  • 举报
回复
ljsql的方法不错 写个存储过程,就是了 让电脑自己去判断
yin9184 2007-07-14
  • 打赏
  • 举报
回复
mark
chenqi0701 2007-07-14
  • 打赏
  • 举报
回复
自己测试的..存储过程来判断利用ljsql的语句...
加工成为存储过程!!!

create procedure Stu_time
@time varchar(50)
as
SELECT CASE WHEN isdate(@time)=1 THEN @time
ELSE DATEADD(DD,-1,DATEADD(MM,1,LEFT(@time,8)+'1')) END
GO
exec Stu_time '2005-02-345'
stbigcrab 2007-07-14
  • 打赏
  • 举报
回复
非常感谢各位,分不多,没办法每人照顾到!
请原谅了.
newqq 2007-07-13
  • 打赏
  • 举报
回复
学习
zjh0205 2007-07-13
  • 打赏
  • 举报
回复
ljsql(第 1 行: '脑子' 附近有语法错误。)
----------------------------------------
的方法最牛!!!
yjlhch 2007-07-13
  • 打赏
  • 举报
回复
以上办法都可以呀,长知识了
云中客 2007-07-12
  • 打赏
  • 举报
回复
可以这样来做:
declare @sDate varchar(10)
Declare @sDay varchar(2)
Declare @Stemp nvarchar(100)
Select @sDate='2005-02-30',@sDay=''
Select @stemp='Select @sDay=day(' + @sDate + ')'
exec sp_executesql @stemp,N'@sDay varchar(2) OUTPUT',@sDay OUTPUT
select @sDate=left(@sDate,len(@sDate)-2)+@sDay
Select @sDate
肥胖的柠檬 2007-07-12
  • 打赏
  • 举报
回复
先判断'2005-02-30'是不是日期,不是就先改为1号再加一个月,再减一天就是了
肥胖的柠檬 2007-07-12
  • 打赏
  • 举报
回复
不用算法
肥胖的柠檬 2007-07-12
  • 打赏
  • 举报
回复
SELECT CASE WHEN isdate('2005-02-30')=1 THEN '2005-02-30' ELSE DATEADD(DD,-1,DATEADD(MM,1,LEFT('2005-02-30',8)+'1')) END

这样就要以了
云中客 2007-07-12
  • 打赏
  • 举报
回复
利用isdate('2005-02-30')仅能判断日期书写格式是否合法,不能判断日期是否正确
需要编写函数来实现楼主的功能
yrwx001 2007-07-12
  • 打赏
  • 举报
回复
算法思想就是
if !isdate(@ddate)
循環 @ddate = @ddate-1 to isdate(@ddate)
return @ddate
else
直接return @ddate
yrwx001 2007-07-12
  • 打赏
  • 举报
回复
create function fn_test(@ddate varchar(10))
returns varchar(10)
as
begin
declare @i int,@ii int
decalre @rdate @varchar(10) = ''
set @i = 1
select @ii = isdate(@ddate)
if (@ii <> 1)
begin
while @i<= 30
begin
select @ddate = dateadd( day,-1,cast(@ddate as datetime))
select @ii = isdate(@ddate)
if (@ii = 1)
return @ddate
set @i += 1
end
end
else return @ddate

end
yrwx001 2007-07-12
  • 打赏
  • 举报
回复
create function fn_test(@ddate varchar(10))
returns varchar(10)
as
begin
declare @i int,@ii int
decalre @rdate @varchar(10) = ''
set @i = 1
select @ii = isdate(@ddate)
if (@ii <> 1)
begin
while @i<= 30
begin
select @ddate = dateadd( day,-1,cast(@ddate as datetime))
select @ii = isdate(@ddate)
if (@ii = 1)
begin

end
end
end
end
echiynn 2007-07-12
  • 打赏
  • 举报
回复
寫了個簡單的函數,僅僅對2月份的日期做了處理,並且必須是標準的10位'yyyy-mm-dd'格式的日期

樓主可以根據自己的需要改進一下

create function fn_IsDate(@dt varchar(10))
returns varchar(10)
as
begin
if((year(@dt) % 4 = 0 and year(@dt) % 100 <> 0) or year(@dt) % 400 = 0)
begin
if(isdate(@dt) = 0 and month(@dt) = 2)
begin
set @dt = left(@dt, 8) + '29'
end
end
else
begin
if(isdate(@dt) = 0 and month(@dt) = 2)
begin
set @dt = left(@dt, 8) + '28'
end
end

return @dt
end
echiynn 2007-07-12
  • 打赏
  • 举报
回复
if((year(@dt) % 4 = 0 and year(@dt) % 100 <> 0) or year(@dt) % 400 = 0)

這個條件是用來判斷閏年的,真為閏年,假為平年

結合isdate()判斷如果為非法日期再自己在函數裏面做處理吧
qingshanyang 2007-07-12
  • 打赏
  • 举报
回复
先判断,类型非法的用函数去处理.
加载更多回复(11)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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