超难问题:如何正确更新缺少“年份”的时间列

wooden954 2010-04-25 05:20:29
在表中有一个存储时间用的列(列数较多,几十列),并且这些列并不能使用字符型(必须是时间日期型,由应用决定)
在更新或插入记录的时候生成的SQL语句列值缺少“年份”,即只有“月-日 时分秒”几个数据段,
在正常情况下更新语句会出错导致不能执行,
不知道有没有办法正确更新这些列?如果有办法,请各位指教一二!
...全文
267 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2010-05-04
  • 打赏
  • 举报
回复
--22更新产品信息
create proc [dbo].[UpdateProductInfoByID]
(
@ID nvarchar(20),
@Title nvarchar(50),
@ModifyTime datetime,
@Author nvarchar(50),
@Hits int,
@ParentID nvarchar(50),
@Content ntext,
@PictureUrl nvarchar(100),
@Keyword nvarchar(100)
)
as
update shuimutingProduct set Title=@Title,Author=@Author,PictureUrl=@PictureUrl,ParentID=@ParentID,ModifyTime=@ModifyTime,Content=@Content,
Hits=@Hits,Keyword=@Keyword where ID=@ID
--23更新密码
create proc [dbo].[UpdatePassword]
(
@Title nvarchar(50),
@Password nvarchar(100)
)
as
update shuimutingAdmin set Password=@Password where Title=@Title
--24得到父类的Depth值
create proc [dbo].[GetDepth]
(
@TableName nvarchar(30),
@ParentID int
)
as
exec ('select Depth from '+@TableName+' where ID='+@ParentID)
--25根据子分类的ID,父分类的Depth更新子分类的depth值
create proc [dbo].[GetChildDepth]
(
@ID int,
@Depth int,
@TableName nvarchar(50)
)
as
declare @res int
set @res=@Depth+1
if @res>3
begin
return 0
end
else
begin
exec ('update '+@TableName+' set Depth='+@res+'where ID='+@ID)
end
--26中医文版(根据表名,数量,是否最新,版本,父类ID)
alter proc [dbo].[GetInfoByVersion]
(
@TableName nvarchar(50),
@Nums int,
@IsNew nvarchar(20),
@Version nvarchar(20),
@ParentID nvarchar(20)
)
as
exec ('select top '+@Nums+' * from '+@TableName+' where version='''+@Version+''' and IsNew='+@IsNew+' and ParentID='+@ParentID+' Order by CreateTime Desc')
--27根据父类ID得到分类名称
create proc [dbo].[GetParentTitleByID]
(
@ID int,
@TableName nvarchar(30)
)
as
exec ('select title from '+@TableName+' where id='+@ID)
--28下载信息
create proc [InsertDownInfo]
(
@Title nvarchar(50),
@FileUrl nvarchar(200),
@Description nvarchar(50),
@Version nvarchar(50)
)
as
insert into kailingDownload(Title,FileUrl,Description,Version)
select @Title,@FileUrl,@Description,@Version
--29修改下载信息列表
create proc UpDownInfoByID
(
@Title nvarchar(50),
@FileUrl nvarchar(200),
@Description nvarchar(50),
ID int
)
as
update kailingDownload set Title=@Title,FileUrl=@FileUrl,Description=@Description where ID=@ID
--30根据父分类ID得到该分类相同关键字的信息
create proc [dbo].[GetDataByParentID]
(
@ID int
)
as
select * from shuimutingNewscategory where keyword in (select keyword from shuimutingNewscategory where ID=@ID)
--31根据分类 ID得到该分类下的产品数量,第一张图片的,ID
create proc [dbo].[GetChildNumAndPic]
as
select P.ID,PID.cnt,P.PictureUrl,PID.Title from
(
select count(W.ID) cnt,P.Title,W.ParentID
from shuimutingProduct W,shuimutingProductcategory P where P.ID=W.ParentID group by P.Title,W.ParentID
)
PID
join
(
select min(PictureUrl) PictureUrl,min(ID) ID,ParentID from shuimutingProduct group by ParentID
)
P on PID.ParentID=P.ParentID
--32根据ID,表明得到标题名称
create proc [dbo].[GetTitle]
(
@ID nvarchar(20),
@TableName nvarchar(30)
)
as
exec ('select Title from '+@TableName +' where ID='+@ID)
--33插入产品信息
create proc [dbo].[InsertProductInfo]
(
@Title nvarchar(100),
@ParentID int,
@ModifyTime datetime,
@Author nvarchar(30),
@Hits int,
@Content ntext,
@PictureUrl nvarchar(100),
@keyword nvarchar(100)
)
as
insert into shuimutingProduct (Title,ParentID,ModifyTime,Author,Hits,[Content],PictureUrl,Keyword)
values (@Title,@ParentID,@ModifyTime,@Author,@Hits,@Content,@PictureUrl,@keyword)
--34根据分类信息得到它的ID
create proc [dbo].[GetParentID]
(
@Title nvarchar(30),
@TableName nvarchar(30)
)
as
exec ('select ID from '+@TableName+' where Title='''+@Title+'''')
--35订单信息
create proc [dbo].[InsertOrder]
(
@Address nvarchar(50),
@Quality nvarchar(50),
@UserName nchar(2),
@Job nvarchar(50),
@Phone nvarchar(50),
@EMail nvarchar(50),
@Num int,
@House nvarchar(50),
@Category nvarchar(50),
@Area nvarchar(50),
@Fee nvarchar(50),
@HouseDate nvarchar(50),
@Style nvarchar(50),
@Description nvarchar(500)
)
as
insert into shuimutingOrder
(Address,Quality,UserName,Job,Phone,EMail,Num,House,Category,Area,Fee,HouseDate,Style,Description)
values
(@Address,@Quality,@UserName,@Job,@Phone,@EMail,@Num,@House,@Category,@Area,@Fee,@HouseDate,@Style,@Description)
--36修改表单信息
create proc [dbo].[UpdateOrder]
(
@ID int,
@Address nvarchar(50),
@Quality nvarchar(50),
@UserName nchar(2),
@Job nvarchar(50),
@Phone nvarchar(50),
@EMail nvarchar(50),
@Num int,
@House nvarchar(50),
@Category nvarchar(50),
@Area nvarchar(50),
@Fee nvarchar(50),
@HouseDate nvarchar(50),
@Style nvarchar(50),
@Description nvarchar(500)
)
as
update shuimutingOrder set Address=@Address,Quality=@Quality,UserName=@UserName,Job=@Job
,Phone=@Phone,EMail=@EMail,Num=@Num,House=@House,Category=@Category,Area=@Area,Fee=@Fee,HouseDate=@HouseDate,
Style=@Style,Description=@Description
--37应聘信息表
create proc [dbo].[InsertCompanyEmployee]
(
@Title nvarchar(50),
@JobNum int,
@JobPhone nvarchar(30),
@JobExperience nvarchar(50),
@Description nvarchar(300),
@JobEducation nvarchar(50),
@JobSalary nvarchar(50)
)
as
insert into yinquanCompanyEmployee (Title,JobNum,JobPhone,JobExperience,Description,JobEducation,JobSalary) values
(@Title,@JobNum,@JobPhone,@JobExperience,@Description,@JobEducation,@JobSalary)
--38修改应聘信息表
create proc [dbo].[UpdateCompanyEmployee]
(
@ID int,
@Title nvarchar(50),
@JobNum int,
@JobPhone nvarchar(30),
@JobExperience nvarchar(50),
@Description nvarchar(300),
@JobEducation nvarchar(50),
@JobSalary nvarchar(50)
)
as
update yinquanCompanyEmployee set Title=@Title,JobNum=@JobNum,JobPhone=@JobPhone,
JobExperience=@JobExperience,Description=@Description,JobEducation=@JobEducation,JobSalary=@JobSalary where ID=@ID
wooden954 2010-05-03
  • 打赏
  • 举报
回复
算了,没有结果,结贴了
  • 打赏
  • 举报
回复
楼主,我想你肯定不是在线等。
问题应该解决了吧。
Coin_Guan 2010-04-28
  • 打赏
  • 举报
回复
个人觉得脏数据最好还是从源头解决。
业务方面不正确,全丢给技术去解决的思路是不对的。
csmark 2010-04-28
  • 打赏
  • 举报
回复
你这样一个一个插入也是比较麻烦,还是先导出整理好,再导入
htl258_Tony 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wooden954 的回复:]
我需要的解决办法就是类似于12楼的办法,即我的SQL语句

SQL code
Insert Into 表 (aTime) values ('01-01 10:00:00')
是不能被改变成

SQL code
Insert Into 表 (aTime) values ('2010-01-01 10:00:00')
的,即我必须使用缺少年份的值构建的SQL语句来进行插入记录操作,但我……
[/Quote]
有的。SQL有instead of 触发器,相当于Oracle的Before
东那个升 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wooden954 的回复:]
我需要的解决办法就是类似于12楼的办法,即我的SQL语句

SQL code
Insert Into 表 (aTime) values ('01-01 10:00:00')
是不能被改变成

SQL code
Insert Into 表 (aTime) values ('2010-01-01 10:00:00')
的,即我必须使用缺少年份的值构建的SQL语句来进行插入记录操作,但我……
[/Quote]

那你只能以字符来存储数据了。不能以时间的形式
wooden954 2010-04-28
  • 打赏
  • 举报
回复
我需要的解决办法就是类似于12楼的办法,即我的SQL语句
Insert Into 表 (aTime) values ('01-01 10:00:00')
是不能被改变成
Insert Into 表 (aTime) values ('2010-01-01 10:00:00')
的,即我必须使用缺少年份的值构建的SQL语句来进行插入记录操作,但我也试了触发器了,好像SQL的触发器只能定义After的触发器,即插入记录语句执行成功后才进行触发器的触发,如果像Oracle可以定义类似于Before的触发器就好解决了,只需要在触发器中对时间值进行校正就能正确写入记录了,不知道SQL有没有类似的办法
hhiew 2010-04-26
  • 打赏
  • 举报
回复
这个很难哦,没事试了下触发器,还是一样会报错
nzperfect 2010-04-26
  • 打赏
  • 举报
回复
果然难
lhblxm 2010-04-26
  • 打赏
  • 举报
回复
楼主先别哭,大家再想想办法
--小F-- 2010-04-26
  • 打赏
  • 举报
回复
没有明白楼主要的结果是什么?
  • 打赏
  • 举报
回复
不是很明白楼主的意思。详细说明吧。
dichun 2010-04-26
  • 打赏
  • 举报
回复
同意楼上的做成触发器或者直接用SQL 一次更新


update inserted set aTime = ltrim(year(getdate()))+'-'+ aTime
永生天地 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wooden954 的回复:]
表:
aTime:DateTime
SQL:
Insert Into 表 (aTime) values ('01-01 10:00:00')
不知道有没有办法将值插入表,也就是说能够有办法将缺失的年份补上,而不是报错。至于年份是补固定值还是补当前时间的年份都可以
[/Quote]
在表上建一个INSTEAD OF INSERT 触发器
CREATE TRIGGER tri_tb on tb
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO tb
SELECT ltrim(year(getdate()))+'-'+ aTime
FROM inserted
END
GO
dawugui 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 wooden954 的回复:]
在表中有一个存储时间用的列(列数较多,几十列),并且这些列并不能使用字符型(必须是时间日期型,由应用决定)
在更新或插入记录的时候生成的SQL语句列值缺少“年份”,即只有“月-日 时分秒”几个数据段,
在正常情况下更新语句会出错导致不能执行,
不知道有没有办法正确更新这些列?如果有办法,请各位指教一二!
[/Quote]
不明白意思.
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
shizheyangde 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sql77 的回复:]
declare @tb table(time datetime)
insert @tb select datename(yy,getdate())+'-'+'01-01 10:00:00'

select * from @tb

(1 行受影响)
time
-----------------------
2010-01-01 10:00:00.000

(1 行受影响)

……
[/Quote]

uping
htl258_Tony 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wooden954 的回复:]
表:
aTime:DateTime
SQL:
Insert Into 表 (aTime) values ('01-01 10:00:00')
不知道有没有办法将值插入表,也就是说能够有办法将缺失的年份补上,而不是报错。至于年份是补固定值还是补当前时间的年份都可以
[/Quote]可以,需要有个规则,方法可以参考77
SQL77 2010-04-25
  • 打赏
  • 举报
回复
可利用
SELECT ISDATE('01-01 10:00:00') 来判断,
如果返回1即可以转成时间型,如果0则不能
SQL77 2010-04-25
  • 打赏
  • 举报
回复
declare @tb table(time datetime)
insert @tb select datename(yy,getdate())+'-'+'01-01 10:00:00'

select * from @tb

(1 行受影响)
time
-----------------------
2010-01-01 10:00:00.000

(1 行受影响)

加载更多回复(6)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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