【问题标题】:Don't understand why DATEADD is not incrementing datatime不明白为什么 DATEADD 不增加日期时间
【发布时间】:2012-07-31 12:59:02
【问题描述】:

将数据从 Access 迁移到 SQL Server。 SQL Server 表将 inst_id、cons_code 和 eff_date_time 列定义为主键。来自访问的 eff_date_time 数据不是唯一的,所以我试图将秒字段增加一秒,这样我就有一个唯一的日期时间。我无法让 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
A PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:07:33.777 NULL NULL
A PU 1901-01-01 17:00:00.000 816.8 dba 2012-08-02 11:07:33.777 NULL NULL
A PU 1901-01-01 17:00:00.000 120.5 dba 2012-08-02 11:07:33.780 NULL NULL
A 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
A PU 1901-01-01 17:00:00.000 833.2 dba 2012-08-02 11:28:27.293 NULL NULL
A PU 1901-01-01 17:00:00.000 816.8 dba 2012-08-02 11:28:27.293 NULL NULL
A PU 1901-01-01 17:00:00.000 120.5 dba 2012-08-02 11:28:27.297 NULL NULL
A 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

【问题讨论】:

  • SELECT DATEADD("ss", 1, GETDATE()) 是正确的,你需要查看 lv_count 并查看其中包含的值。您认为错误是什么?你有没有运行 sql profiler/debug 可能是什么问题。
  • 你确定它不起作用吗?在您的UPDATE 之后的PRINT CONVERT(VARCHAR, @cv_EffDateTime, 121) 仍将打印在@cv_EffDateTime 中捕获的值,而不是表格行中的当前值。
  • 更新前表中的数据。
  • JonH,@lv_count 正在按我的预期递增;我会尽快发布输出以显示。
  • Damien_The_Unbeliever。正确,更新后的PRINT CONVERT(VARCHAR, @cv_EffDateTime, 121) 仍将显示之前存储的@cv_EffDateTime 值,而不是更新/更改日期;我正在查看表中的数据以验证实际发生的变化;我会尽快发布输出

标签: tsql datetime dateadd


【解决方案1】:

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

最好的解决方案是添加一个新列 ID,它的类型为 INT IDENITY PRIMARY KEY,然后将复合主键放在 inst_id、cons_code 和 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

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2011-02-13
    • 2022-08-23
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多