【问题标题】:Getting incorrect data in datatime from varchar从 varchar 获取日期时间不正确的数据
【发布时间】:2018-01-03 11:25:07
【问题描述】:

在数据库中有一个名为 Tbl_GIT 的表。数据正在从多个地方插入/更新。我得到一些格式类似于01/02/18 01:53:30 p. m.01/02/18 08:22:24 a. m. 的临时数据,我希望如果数据以这种格式插入/更新,我可以在插入/更新后使用触发器更正此问题。表中归档的 GT9 和 GT10 为 varchar(50)。那么我该怎么做呢。

下面是我的示例数据

ID            GT9                    GT10
 7686004401    12/8/17 4:33:36 PM     01/02/18 06:51:38 a. m. 
 6871761806    12/7/17 5:45:29 AM     01/02/18 12:03:33 p. m. 
 7694553943    12/21/17 7:22:59 AM    01/02/18 07:45:57 a. m.  
 7696265108    12/29/17 6:55:53 AM    01/02/18 12:38:24 PM
 696265124     12/28/17 8:19:30 PM    01/02/18 08:56:21 AM
 697024242     12/29/17 9:35:44 AM    01/02/18 05:25:28 AM

提前感谢您的帮助。

表 DDL

CREATE TABLE [dbo].[Tbl_GIT] (
    [ORDERID]        INT           NOT NULL,
    [ID]             INT           IDENTITY (1, 1) NOT NULL,
    [GT1]        VARCHAR (255) NULL,
    [GT2]        VARCHAR (255) NULL,
    [GT3]        VARCHAR (255) NULL,
    [GT4]        VARCHAR (255) NULL,
    [GT5]        VARCHAR (255) NULL,
    [GT6]        VARCHAR (255) NULL,
    [GT7]        VARCHAR (255) NULL,
    [GT8]        VARCHAR (255) NULL,
    [GT9]        VARCHAR (255) NULL,
    [GT10]       VARCHAR (255) NULL,
    [GPSLONG]        VARCHAR (20)  NULL,
    [GPSLAT]         VARCHAR (20)  NULL   

);

【问题讨论】:

  • 如果您需要触发器,我们需要您的表的 DDL。我将假设您还有其他列,例如 GT1、GT2、...GT8 或其他也有相同问题的列。如果是这样,您是否也考虑过使用 3NF?
  • @Larnu 是的,有 GT1 到 GT11,但我在上面提供了 GT9、GT11。因为所有其他人都在存储笔记,所以这对我来说并不重要
  • 这些列中的任何一个都可能有错误的格式吗?另外,你不使用 3NF 的理由是什么?这也是一种选择吗?
  • @Larnu 不,这些字段中没有任何错误的数据格式
  • @Larnu 3NF 你在谈论标准化吗?抱歉,知道数据库中有 1 TB 的数据,我无法做到这一点

标签: sql-server sql-server-2008 triggers


【解决方案1】:

下面的示例代码应该将 varchar 字段 GT10 更新为所需的格式。

create table Tbl_GIT
(
ID int identity,
GT9 varchar(50),
GT10 varchar(50)
)
GO
insert into Tbl_GIT values ('12/8/17 4:33:36 PM','01/02/18 06:51:38 a. m.'),('12/29/17 6:55:53 AM','01/02/18 12:38:24 PM')

select * from Tbl_GIT
GO
create trigger tr_tmp_Insert on Tbl_GIT after insert
as
begin
    IF EXISTS(SELECT 1 FROM inserted WHERE GT10 LIKE '%p. m.' OR GT10 LIKE '%p.m.' OR GT10 LIKE '%a. m.' OR GT10 LIKE '%a.m.')
    BEGIN
        UPDATE Tbl_GIT SET GT10 = REPLACE(REPLACE(REPLACE(REPLACE(GT10,'p.m.','PM'),'p. m.','PM'),'a.m.','AM'),'a. m.','AM')
    END
end
GO
insert into Tbl_GIT values ('12/8/17 4:33:36 PM','01/05/18 06:51:38 p. m.')
insert into Tbl_GIT values ('12/29/17 6:55:53 AM','01/12/18 12:38:24 a. m.')
insert into Tbl_GIT values ('12/29/17 6:55:53 AM','01/01/18 12:38:24 a.m.')
insert into Tbl_GIT values ('12/29/17 6:55:53 AM','01/03/18 12:38:24 p.m.')
select * from Tbl_GIT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多