Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL是从dateTime创建int值的最有效方法_Sql_Sql Server_Tsql_Triggers_Sql Server 2008 R2 - Fatal编程技术网

SQL是从dateTime创建int值的最有效方法

SQL是从dateTime创建int值的最有效方法,sql,sql-server,tsql,triggers,sql-server-2008-r2,Sql,Sql Server,Tsql,Triggers,Sql Server 2008 R2,使用SQL Server 2008 R2,我有一个触发器,可以在更新后更新字段。它插入每个更新行的日期。触发器中的此行执行以下操作: SET t.lastUpdatedDateTime = CURRENT_TIMESTAMP 使用YYYYMMDDHHMMS,上述行将插入此2015-07-16 16:19:00。现在我遇到了这样一种情况,业务部门需要一个整数版本 实现这一目标最有效的方法是什么。这是我拥有的,它确实有效,但似乎非常长且昂贵: SET t.lastUpdatedDateTimeIN

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

SET t.lastUpdatedDateTime = CURRENT_TIMESTAMP
使用YYYYMMDDHHMMS,上述行将插入此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)
有没有更好更有效的方法?预期结果为201507161900


第二个问题。我根本不喜欢将日期存储为整数。事实上,在担任目前的角色之前,我从来没有这样做过。我可以就此征求意见吗?有什么好的理由可以避免这样做?有几个原因可以解释为什么在这个组织中有这样的偏好。这里有一个例子,每次客户端访问Web服务时,这个日期时间值都会随内容一起传递,当客户端将来访问Web服务时,它需要传入这个日期时间值,以便有效地获取最佳数据。简单地说,企业担心这会以不同的形式出现

编辑:

以下是完整性的全部触发因素:

    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

如果只需要日期的整数部分,则解决方案之一是删除日期值中的分隔符,例如:-'/'、'-'、':'和''空格from Date,然后您将获得所需格式的日期:-

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

更新:-

按照你的要求使用这个

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

如果列
lastUpdatedDateTimeINT
为INT,那么它将引发溢出错误,因此必须更改该列的数据类型,因为要为INT指定的值非常大如果只需要日期的整数部分,那么解决方案之一就是删除日期值ex:-'/'中的分隔符,“-”、“:”和“从日期开始空格,您将获得所需格式的日期:-

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

更新:-

按照你的要求使用这个

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

如果列
lastUpdateDateTimeInt
为INT,则会抛出溢出错误,因此,如果业务部门担心客户端无法正确处理复杂的数据类型,例如
datetime
,并且希望使用简单的
INT
,那么您必须更改该列的数据类型,因为您要为INT分配的值非常大

将日期存储为简单的
int
-的一种广泛使用的方法是unix时间。总是UTC。这仅仅是自1970-01-01以来经过的秒数。在任何情况下都应该使用
bigint
,而不是
int
。尽管如此,我还是会将日期作为
datetime
存储在数据库中,并在与客户端对话时将其转换为unix时间和unix时间

从unix时间转换为日期时间:

DATEADD(second, [unixtime_value], '19700101')
从日期时间转换为unix时间:

DATEDIFF(second, '19700101', [datetime_value])
使用
GETUTCDATE
获取当前UTC时间,然后将其转换为
bigint
,而不是
CURRENT\u TIMESTAMP

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

如果业务部门担心客户端无法正确处理复杂的数据类型,例如
datetime
,并且希望使用简单的
int
,那么至少使用一种标准方法将日期存储为
int

将日期存储为简单的
int
-的一种广泛使用的方法是unix时间。总是UTC。这仅仅是自1970-01-01以来经过的秒数。在任何情况下都应该使用
bigint
,而不是
int
。尽管如此,我还是会将日期作为
datetime
存储在数据库中,并在与客户端对话时将其转换为unix时间和unix时间

从unix时间转换为日期时间:

DATEADD(second, [unixtime_value], '19700101')
从日期时间转换为unix时间:

DATEDIFF(second, '19700101', [datetime_value])
使用
GETUTCDATE
获取当前UTC时间,然后将其转换为
bigint
,而不是
CURRENT\u TIMESTAMP

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

你失去了日期数学的所有功能,必须重写它。享受使用它的乐趣。另外,这是愚蠢的。告诉你的企业这是一个可怕的原因。“当客户端将来访问Web服务时,它需要传入这个dateTime值以有效地获取最佳数据”,然后以某种方式将dateTime字段转换为Web服务中的整数。不要仅仅因为你希望它以某种方式呈现,就把它当作垃圾来存储。当你想用不同的方式表达时会发生什么?还是计算一下呢?谢谢你的评论。我一点也不赞成它,但我不是决策者,因为我知道它“愚蠢”和“可怕”,我们失去了所有内置的日期函数。我想知道为什么要对这一决定进行审查,是否还有其他角度?再次感谢您的光临如果业务部门担心客户端无法正确处理复杂的数据类型,如
datetime
,并且希望使用simple
int
,至少要使用一种标准的方法将日期存储为int。将日期存储为simple
int
,其中一种广泛使用的方法是unix时间。总是UTC。这只是自1970-01-01以来经过的秒数。在任何情况下都应该使用
bigint
,而不是
int
。尽管如此,我还是会将日期作为
datetime
存储在数据库中,并在与客户端对话时将其转换为unix时间和unix时间。您将失去日期数学的所有功能,必须重写它。享受使用它的乐趣。另外,这是愚蠢的。告诉你的企业这是一个可怕的原因。“当客户端将来访问Web服务时,它需要传入这个dateTime值以有效地获取最佳数据”,然后以某种方式将dateTime字段转换为Web服务中的整数。不要仅仅因为你希望它以某种方式呈现,就把它当作垃圾来存储。当你想展示时会发生什么