注册 登录
编程论坛 SQL Server论坛

我的一个表内有有效期这一列,但是有效期都是某月1日的,我要改成某月31日

stlyps 发布于 2013-08-18 16:00, 695 次点击
案例如下
1,3,5,7,8,10,12月1日改成1,3,5,7,8,10,12月31日
4,6,9,11月1日改成4,6,9,11月30日
如果是闰年2月1日则变成2月29日
不是闰年2月1日的则变成2月28日
8 回复
#2
stlyps2013-08-18 16:01
希望高手帮帮忙啊!小弟在这里多谢各位高手了
#3
stlyps2013-08-18 16:06
没有人能帮帮我吗?
#4
Aviva_Wang2013-08-19 09:03
这样的话,肯定是插入数据的时候判断这个月份的最后一天是几,你可以写个存储过程去解决这个插入问题
#5
antjl2013-08-19 09:35
你把这列数据的数据类型说出来,还有列出部分数据例子,才好对症下药。
#6
antjl2013-08-19 09:48
如果是日期型数据类型,很简单 Select DateAdd(Day,-1,DateAdd(Month,1,[数据列名])) From [表名]
即先加1个月,再减1天。
#7
3037709572013-08-19 11:51
程序代码:

如果你的【有效期】这一列的数据类型是varchar类型并且数据格式是'xxxx年xx月xx日'的话,
那么可以仿照下面的代码来实现,先定义一个实现这个功能的函数,然后调用这个函数来更新。

----------Create Table Named TestDate----------
IF EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[dbo].[TestDate]') AND type in (N'U'))
DROP TABLE [dbo].[TestDate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestDate](
    [有效期] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

GO

----------insert data for test----------
Delete From [dbo].[TestDate]
GO

Insert Into TestDate(有效期) Values('2010年1月1日')
GO

Insert Into TestDate(有效期) Values('2010年3月1日')
GO

Insert Into TestDate(有效期) Values('2010年5月1日')
GO

Insert Into TestDate(有效期) Values('2010年7月1日')
GO

Insert Into TestDate(有效期) Values('2010年8月1日')
GO

Insert Into TestDate(有效期) Values('2010年10月1日')
GO

Insert Into TestDate(有效期) Values('2010年12月1日')
GO

Insert Into TestDate(有效期) Values('2010年4月1日')
GO

Insert Into TestDate(有效期) Values('2010年6月1日')
GO

Insert Into TestDate(有效期) Values('2010年9月1日')
GO

Insert Into TestDate(有效期) Values('2010年11月1日')
GO

Insert Into TestDate(有效期) Values('2010年2月1日')
GO

Insert Into TestDate(有效期) Values('2000年2月1日')
GO

Insert Into TestDate(有效期) Values('2008年2月1日')
GO

Insert Into TestDate(有效期) Values('1900年2月1日')
GO

----------Create Function Named ModifyDate----------
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ModifyDate]') AND type in (N'FN',N'TF',N'IF'))
DROP FUNCTION [dbo].[ModifyDate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[ModifyDate](@DateValue varchar(50))
RETURNS varchar(50)
AS
BEGIN
    declare @ReturnValue varchar(50) set @ReturnValue=''
    declare @Year int
    set @Year=charindex('',@DateValue)
    declare @Month int
    set @Month=charindex('',@DateValue)
    declare @Day int
    set @Day=charindex('',@DateValue)  

    if (select count(*) from (select substring(@DateValue,@Year+1,@Month-@Year-1) as [Month]) as M
        where [Month] in (1,3,5,7,8,10,12))>0
        set @ReturnValue=substring(@DateValue,0,@Month+1)+'31'+substring(@DateValue,@Day,len(@DateValue)+1-@Day)
     
    if (select count(*) from(select substring(@DateValue,@Year+1,@Month-@Year-1) as [Month]) as M
        where [Month] in (4,6,9,11))>0
        set @ReturnValue=substring(@DateValue,0,@Month+1)+'30'+substring(@DateValue,@Day,len(@DateValue)+1-@Day)

    if (select count(*) from (select substring(@DateValue,@Year+1,@Month-@Year-1) as [Month]) as M
        where [Month]=2)>0
     begin
         declare @YearNumber int
         set @YearNumber=cast(substring(@DateValue,0,@Year) as int)

         if @YearNumber%400=0 or (@YearNumber%100<>0 and @YearNumber%4=0)
           set @ReturnValue=substring(@DateValue,0,@Month+1)+'29'+substring(@DateValue,@Day,len(@DateValue)+1-@Day)
         else
           set @ReturnValue=substring(@DateValue,0,@Month+1)+'28'+substring(@DateValue,@Day,len(@DateValue)+1-@Day)
     end
    return @ReturnValue
END
GO

----------------To see the data before update---------------------------------------
select * from [TestDate]
Go
----------------update what you wanted---------------------------------------
update [TestDate] set [有效期]=[dbo].ModifyDate([有效期])
where [有效期] is not null
and len([有效期])>0
and  charindex('',[有效期])>0
and charindex('',[有效期])>0
and charindex('',[有效期])>0
Go
----------------To see the data after you updated---------------------------------------
select * from [TestDate]
Go
执行结果如下:
只有本站会员才能查看附件,请 登录



[ 本帖最后由 303770957 于 2013-8-19 12:10 编辑 ]
#8
3037709572013-08-19 11:56
如果你觉得上面的思路和代码不错的话,请将代码拿走留下悬赏,多谢!
#9
stlyps2013-09-07 15:53
xiexie
1