标题:我的一个表内有有效期这一列,但是有效期都是某月1日的,我要改成某月31日
只看楼主
stlyps
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-18
结帖率:0
已结贴  问题点数:20 回复次数:8 
我的一个表内有有效期这一列,但是有效期都是某月1日的,我要改成某月31日
案例如下
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日
搜索更多相关主题的帖子: 有效期 
2013-08-18 16:00
stlyps
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-18
得分:0 
希望高手帮帮忙啊!小弟在这里多谢各位高手了
2013-08-18 16:01
stlyps
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-18
得分:0 
没有人能帮帮我吗?
2013-08-18 16:06
Aviva_Wang
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:苏州
等 级:贵宾
威 望:26
帖 子:701
专家分:2382
注 册:2013-3-12
得分:7 
这样的话,肯定是插入数据的时候判断这个月份的最后一天是几,你可以写个存储过程去解决这个插入问题

asp
2013-08-19 09:03
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:7 
你把这列数据的数据类型说出来,还有列出部分数据例子,才好对症下药。
2013-08-19 09:35
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:0 
如果是日期型数据类型,很简单 Select DateAdd(Day,-1,DateAdd(Month,1,[数据列名])) From [表名]
即先加1个月,再减1天。
收到的鲜花
  • stlyps2013-09-07 15:58 送鲜花  1朵   附言:我很赞同
2013-08-19 09:48
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
得分:7 
程序代码:
如果你的【有效期】这一列的数据类型是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 编辑 ]

♂ 死后定当长眠,生前何须久睡。♀
2013-08-19 11:51
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
得分:0 
如果你觉得上面的思路和代码不错的话,请将代码拿走留下悬赏,多谢!

♂ 死后定当长眠,生前何须久睡。♀
2013-08-19 11:56
stlyps
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-18
得分:0 
xiexie
2013-09-07 15:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419316-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.086011 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved