gpt4 book ai didi

tsql - 不明白为什么DATEADD不增加日期时间

转载 作者:行者123 更新时间:2023-12-04 16:11:58 25 4
gpt4 key购买 nike

将数据从Access迁移到SQL Server。 SQL Server表将inst_id,cons_code和eff_date_time列定义为主键。来自访问的eff_date_time数据不是唯一的,因此我试图将seconds字段增加一秒,因此我将拥有一个唯一的datetime。我无法使DATEADD将日期增加1秒。附件是我的代码。我究竟做错了什么???

USE [CON-INST]  
GO

DECLARE
@cv_InstId VARCHAR(25),
@cv_ConsCode VARCHAR(10),
@cv_EffDateTime DATETIME,
@lv_count INT

DECLARE BumpDate_Cursor CURSOR
STATIC
FOR
SELECT inst_id, cons_code, eff_date_time
FROM [CON-INST].[dba].[constants_temp]
ORDER BY inst_id

OPEN BumpDate_Cursor

FETCH FIRST FROM BumpDate_Cursor
INTO @cv_InstId, @cv_ConsCode, @cv_EffDateTime

SET @lv_count = 1

// Debug statements
PRINT '@cv_InstId = ' + @cv_InstId
PRINT '@cv_ConsCode = ' + @cv_ConsCode
PRINT '@cv_EffDateTime = ' + CONVERT(VARCHAR, @cv_EffDateTime)
PRINT '@lv_count = ' + CONVERT(VARCHAR, @lv_count)

-- Loop to iterate thru instruments identifying the various constant
types that are needed, i.e. the column names - constant 1, constant 2,
constant 3, station, offset, etc.
WHILE @@FETCH_STATUS = 0
-- do processing
BEGIN
PRINT '@lv_count before = ' + CONVERT(VARCHAR, @lv_count)
PRINT CONVERT(VARCHAR, @cv_EffDateTime, 121)
IF (CONVERT(VARCHAR, @cv_EffDateTime,121) = '1901-01-01 17:00:00.000')
BEGIN
UPDATE [CON-INST].[dba].[constants_temp]
SET eff_date_time = DATEADD(second, @lv_count, eff_date_time)
WHERE inst_id = @cv_InstId and cons_code = @cv_ConsCode;
PRINT CONVERT(VARCHAR, @cv_EffDateTime, 121)
END

FETCH NEXT FROM BumpDate_Cursor
INTO @cv_InstId, @cv_ConsCode, @cv_EffDateTime

SET @lv_count = @lv_count + 1
PRINT '@lv_count after = ' + CONVERT(VARCHAR, @lv_count)
END

CLOSE BumpDate_Cursor

DEALLOCATE BumpDate_Cursor

更新之前的表中的数据
inst_id cons_code eff_date_time常量entry_user输入代码entry_date update_user update_date
1 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.770 NULL NULL
1 PU 1901-01-01 17:00:00.000 821.6 dba 2012-08-02 11:07:33.770 NULL NULL
1 PU 1901-01-01 17:00:00.000 8 dba 2012-08-02 11:07:33.770 NULL NULL
1 PU 1901-01-01 17:00:00.000 2251 dba 2012-08-02 11:07:33.770 NULL NULL
2 PU 1901-01-01 17:00:00.000 2251 dba 2012-08-02 11:07:33.770 NULL NULL
2 PU 1901-01-01 17:00:00.000 22 dba 2012-08-02 11:07:33.770 NULL NULL
2 PU 1901-01-01 17:00:00.000 820.9 dba 2012-08-02 11:07:33.773 NULL NULL
2 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.773 NULL NULL
3 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.773 NULL NULL
3 PU 1901-01-01 17:00:00.000 821.5 dba 2012-08-02 11:07:33.773 NULL NULL
3 PU 1901-01-01 17:00:00.000 8 dba 2012-08-02 11:07:33.773 NULL NULL
3 PU 1901-01-01 17:00:00.000 2095 dba 2012-08-02 11:07:33.773 NULL NULL
4 PU 1901-01-01 17:00:00.000 2095 dba 2012-08-02 11:07:33.777 NULL NULL
4 PU 1901-01-01 17:00:00.000 22 dba 2012-08-02 11:07:33.777 NULL NULL
4 PU 1901-01-01 17:00:00.000 820.5 dba 2012-08-02 11:07:33.777 NULL NULL
4 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.777 NULL NULL
PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.777 NULL NULL
PU 1901-01-01 17:00:00.000 816.8 dba 2012-08-02 11:07:33.777 NULL NULL
PU 1901-01-01 17:00:00.000 120.5 dba 2012-08-02 11:07:33.780 NULL NULL
PU 1901-01-01 17:00:00.000 2255 dba 2012-08-02 11:07:33.780 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 1492 dba 2012-08-02 11:07:33.780 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 986.48 dba 2012-08-02 11:07:33.780 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:07:33.780 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:07:33.780 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 986.48 dba 2012-08-02 11:07:33.780 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 1857 dba 2012-08-02 11:07:33.780 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 1896 dba 2012-08-02 11:07:33.783 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 986.5 dba 2012-08-02 11:07:33.783 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:07:33.783 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:07:33.783 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 986.5 dba 2012-08-02 11:07:33.783 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 1936 dba 2012-08-02 11:07:33.783 NULL NULL

执行期间PRINT语句的输出

@cv_InstId = 1

@cv_ConsCode = PU

@cv_EffDateTime = 1901年1月1日下午5:00

@lv_count = 1

更新前:1901-01-01 17:00:00.000

@lv_count = 2

更新前:1901-01-01 17:00:00.000

@lv_count = 3

更新前:1901-01-01 17:00:00.000

@lv_count = 4

更新前:1901-01-01 17:00:00.000

@lv_count = 5

更新前:1901-01-01 17:00:00.000

@lv_count = 6

更新前:1901-01-01 17:00:00.000

@lv_count = 7

更新前:1901-01-01 17:00:00.000

@lv_count = 8

更新前:1901-01-01 17:00:00.000

@lv_count = 9

更新前:1901-01-01 17:00:00.000

@lv_count = 10

更新前:1901-01-01 17:00:00.000

@lv_count = 11

更新前:1901-01-01 17:00:00.000

@lv_count = 12

更新前:1901-01-01 17:00:00.000

@lv_count = 13

更新前:1901-01-01 17:00:00.000

@lv_count = 14

更新前:1901-01-01 17:00:00.000

@lv_count = 15

更新前:1901-01-01 17:00:00.000

@lv_count = 16

更新前:1901-01-01 17:00:00.000

@lv_count = 17

更新前:1901-01-01 17:00:00.000

@lv_count = 18

更新前:1901-01-01 17:00:00.000

@lv_count = 19

更新前:1901-01-01 17:00:00.000

@lv_count = 20

更新前:1901-01-01 17:00:00.000

@lv_count = 21

更新前:1972-07-01 00:00:00.000

@lv_count = 22

更新前:1972-07-01 00:00:00.000

@lv_count = 23

更新前:1972-07-01 00:00:00.000
@lv_count = 24

更新前:1972-07-01 00:00:00.000

@lv_count = 25

更新前:1972-07-01 00:00:00.000

执行后的表输出
inst_id cons_code eff_date_time常数entry_user entry_date update_user update_date
1 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.287 NULL NULL
1 PU 1901-01-01 17:00:00.000 821.6 dba 2012-08-02 11:28:27.287 NULL NULL
1 PU 1901-01-01 17:00:00.000 8 dba 2012-08-02 11:28:27.290 NULL NULL
1 PU 1901-01-01 17:00:00.000 2251 dba 2012-08-02 11:28:27.290 NULL NULL
2 PU 1901-01-01 17:00:00.000 2251 dba 2012-08-02 11:28:27.290 NULL NULL
2 PU 1901-01-01 17:00:00.000 22 dba 2012-08-02 11:28:27.290 NULL NULL
2 PU 1901-01-01 17:00:00.000 820.9 dba 2012-08-02 11:28:27.290 NULL NULL
2 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.290 NULL NULL
3 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.290 NULL NULL
3 PU 1901-01-01 17:00:00.000 821.5 dba 2012-08-02 11:28:27.290 NULL NULL
3 PU 1901-01-01 17:00:00.000 8 dba 2012-08-02 11:28:27.290 NULL NULL
3 PU 1901-01-01 17:00:00.000 2095 dba 2012-08-02 11:28:27.293 NULL NULL
4 PU 1901-01-01 17:00:00.000 2095 dba 2012-08-02 11:28:27.293 NULL NULL
4 PU 1901-01-01 17:00:00.000 22 dba 2012-08-02 11:28:27.293 NULL NULL
4 PU 1901-01-01 17:00:00.000 820.5 dba 2012-08-02 11:28:27.293 NULL NULL
4 PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.293 NULL NULL
PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.293 NULL NULL
PU 1901-01-01 17:00:00.000 816.8 dba 2012-08-02 11:28:27.293 NULL NULL
PU 1901-01-01 17:00:00.000 120.5 dba 2012-08-02 11:28:27.297 NULL NULL
PU 1901-01-01 17:00:00.000 2255 dba 2012-08-02 11:28:27.297 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 1492 dba 2012-08-02 11:28:27.297 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 986.48 dba 2012-08-02 11:28:27.297 NULL NULL
A-1 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.297 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.297 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 986.48 dba 2012-08-02 11:28:27.300 NULL NULL
A-10 AS 1972-07-01 00:00:00.000 1857 dba 2012-08-02 11:28:27.300 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 1896 dba 2012-08-02 11:28:27.300 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 986.5 dba 2012-08-02 11:28:27.300 NULL NULL
A-11 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.300 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.300 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 986.5 dba 2012-08-02 11:28:27.300 NULL NULL
A-12 AS 1972-07-01 00:00:00.000 1936 dba 2012-08-02 11:28:27.300 NULL NULL
A-13 AS 1972-07-01 00:00:00.000 1976 dba 2012-08-02 11:28:27.300 NULL NULL
A-13 AS 1972-07-01 00:00:00.000 986.46 dba 2012-08-02 11:28:27.300 NULL NULL
A-13 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.303 NULL NULL
A-14 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.303 NULL NULL
A-14 AS 1972-07-01 00:00:00.000 986.48 dba 2012-08-02 11:28:27.303 NULL NULL
A-14 AS 1972-07-01 00:00:00.000 2016 dba 2012-08-02 11:28:27.303 NULL NULL
A-15 AS 1972-07-01 00:00:00.000 0 dba 2012-08-02 11:28:27.303 NULL NULL

最佳答案

该代码有一些问题,但主要的问题是update语句-一次更新数据库中的多个记录。例如,当循环运行第一次更新时,它将更新inst_id ='1'和const_code ='PU'的四个记录,每个记录增加1秒。然后在第二次迭代中,对所有四个记录添加2秒,在第三次迭代中向所有四个记录添加3秒,最后在第四次迭代中对所有四个记录添加4秒(使它们全部为1 + 2 + 3 + 4 =下午5点后10秒)。

最佳解决方案是添加一个新列ID(其类型为INT IDENITY PRIMARY KEY),然后将复合主键放在inst_id,consscode和eff_date_time列上。

但是,如果由于某种原因必须在这三个字段上使用复合主键,那么这里是执行此操作的代码。

注意:您不能仅在每个日期中添加一些唯一的数字,因为您可能会达到一秒钟的增量,以致于实际上与表中遇到的另一个值发生冲突。这就是代码的EXISTS部分的原因。

drop table [constants_temp]
go
drop table [constants_new]
go

create table [constants_temp] (
inst_id varchar(25),
cons_code varchar(10),
eff_date_time datetime
)

insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('1', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('1', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('1', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('1', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('2', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('2', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('2', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('2', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('3', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('3', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('3', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('3', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('4', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('4', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('4', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('4', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A', 'PU', '1901-01-01 17:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-1', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-1', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-1', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-10', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-10', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-10', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-11', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-11', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-11', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-12', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-12', 'AS', '1972-07-01 00:00:00.000')
insert into [constants_temp] (inst_id, cons_code, eff_date_time) values ('A-12', 'AS', '1972-07-01 00:00:00.000')

-- Create a table with the idential structure as [constants_temp], except with the composite primary key on all three fields
create table [constants_new] (
inst_id varchar(25),
cons_code varchar(10),
eff_date_time datetime,
PRIMARY KEY (inst_id, cons_code, eff_date_time)
)

-- Variables to hold the column values from each row in the cursor
DECLARE @Cur_inst_id VARCHAR(25)
DECLARE @Cur_cons_code VARCHAR(10)
DECLARE @Cur_eff_date_time DATETIME

-- Go through all of the records in the [constants_temp] table
DECLARE BumpDate_Cursor CURSOR FOR
SELECT inst_id,
cons_code,
eff_date_time
FROM [constants_temp]
ORDER BY inst_id, cons_code, eff_date_time

-- Open the cursor and get the first record
OPEN BumpDate_Cursor
FETCH NEXT FROM BumpDate_Cursor INTO @Cur_inst_id, @Cur_cons_code, @Cur_eff_date_time

-- For all the the records in the cursor...
WHILE @@FETCH_STATUS = 0
BEGIN
-- While there is already a record with a matching institution code, cons code, and effective date...
WHILE EXISTS (SELECT inst_id
FROM [constants_new]
WHERE inst_id = @Cur_inst_id and
cons_code = @Cur_cons_code and
eff_date_time = @Cur_eff_date_time)
BEGIN
-- Keep incrementing the effective date by one second
set @Cur_eff_date_time = DATEADD(second, 1, @Cur_eff_date_time)
END

-- Insert the new unique row
INSERT INTO [constants_new] (inst_id, cons_code, eff_date_time) VALUES (@Cur_inst_id, @Cur_cons_code, @Cur_eff_date_time)

-- Get the next record in the cursor
FETCH NEXT FROM BumpDate_Cursor INTO @Cur_inst_id, @Cur_cons_code, @Cur_eff_date_time
END

-- Close and deallocate the cursor
CLOSE BumpDate_Cursor
DEALLOCATE BumpDate_Cursor

-- Show the results
select * from [constants_new] order by inst_id, cons_code, eff_date_time

关于tsql - 不明白为什么DATEADD不增加日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11779438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com