SQL从dateTime

时间:2015-07-16 22:42:26

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

使用SQL Server 2008 R2,我有一个触发器,可以在更新后更新字段。它为每个更新的行插入日期。触发器中的这一行执行此操作:

SET t.lastUpdatedDateTime = CURRENT_TIMESTAMP

使用yyyymmddhhmmss以上行将插入此2015-07-16 16:19:00。现在我遇到了业务需要整数版本的情况。

实现这一目标的最有效方法是什么。这就是我的工作,但它似乎很长很昂贵:

SET t.lastUpdatedDateTimeINT = CAST('' + cast(year(GETDATE()) as varchar(4)) + right('0' + cast((month(GETDATE())) as varchar(2)), 2) + right('0' + cast((day(GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(hh, GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(MI, GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(ss, GETDATE())) as varchar(2)), 2)  as bigint)

有更好的更有效的方法吗?期望的结果是20150716161900

第二个问题。我不喜欢将日期存储为整数。事实上,在此当前角色之前,我从未这样做过。我可以就此问一些意见,有什么理由可以避免这种情况?有几个原因可以解释为什么在这个组织中存在这种偏好。这是一个,每当客户端点击web服务时,这个dateTime值随内容一起传递,当客户端将来点击web服务时,它需要将此dateTime值传递给effectivley以获得最佳数据。简单地说,企业担心这会以不同的格式回归。

编辑:

以下是完整性的完整触发器:

    ALTER TRIGGER [dbo].[trig_lastUpdated]
    ON [dbo].[AAdeleteMe] 
    AFTER UPDATE
    AS
    BEGIN 
        IF NOT UPDATE(lastUpdatedDateTime)
        BEGIN
            UPDATE t
                 -- my original code (the long way for my result)
                 --SET t.lastUpdatedDateTimeINT = CAST('' + cast(year(GETDATE()) as varchar(4)) + right('0' + cast((month(GETDATE())) as varchar(2)), 2) + right('0' + cast((day(GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(hh, GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(MI, GETDATE())) as varchar(2)), 2) + right('0' + cast((datepart(ss, GETDATE())) as varchar(2)), 2)  as bigint)
                 --and here is the solution below (the shortway for my result)
                 --SET t.lastUpdatedDateTimeINT = REPLACE(REPLACE((convert(varchar(10),CURRENT_TIMESTAMP,111) + convert(varchar(8),CURRENT_TIMESTAMP,114)),'/',''),':','')
                --Just discovered the 112 format so managed to drop one replace
                SET t.lastUpdatedDateTimeINT = REPLACE((convert(varchar(10),CURRENT_TIMESTAMP,112) + convert(varchar(8),CURRENT_TIMESTAMP,114)),':','') 
                FROM dbo.AADeleteMe AS t 
                INNER JOIN inserted AS i 
                ON t.ID = i.ID;
        END
    END

    GO

2 个答案:

答案 0 :(得分:4)

如果您只想要Date的整数部分,那么其中一个解决方案就是删除日期值中的分隔符ex: - ' /',' - ',& #39;:'和' '从日期开始的空格,您将获得所需格式的日期: -

SELECT REPLACE(REPLACE(REPLACE ( '2015-07-16 16:19:00' , '-' , '' ),':',''),' ','')

输出: - 20150716161900

See DEMO

<强>更新: -

根据您的要求使用此

Select REPLACE(REPLACE((convert(varchar(10),CURRENT_TIMESTAMP,101) 
                + convert(varchar(8),CURRENT_TIMESTAMP,114)),'/',''),':','')

如果您的列lastUpdatedDateTimeINT是INT,那么它将抛出溢出错误,因此要克服您必须更改该列的数据类型,因为您要分配的值对于INT来说非常大

答案 1 :(得分:2)

如果企业担心客户端无法正确处理datetime等复杂数据类型并希望使用简单int,那么至少使用标准方式将日期存储为int

将日期存储为简单int的广泛传播方式之一 - 是unix时间。它始终是UTC。这是自1970-01-01以来的几秒钟。在任何情况下,您都应该使用bigint,而不是int。不过,我会将日期作为datetime存储在数据库中,并在与客户端交谈时将其转换为unix时间。

从unix时间转换为datetime:

DATEADD(second, [unixtime_value], '19700101')

从datetime转换为unix时间:

DATEDIFF(second, '19700101', [datetime_value])

而不是CURRENT_TIMESTAMP使用GETUTCDATE来获取当前的UTC时间,然后将其转换为bigint

DATEDIFF(second, '19700101', GETUTCDATE())