SQL 从 dateTime 创建 int 值的最有效方法
SQL Most efficient way to create int value from dateTime
使用 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 值以有效地获得最佳数据。简单地说,企业担心这会以不同的格式返回。
已编辑:
这是完整度的完整触发器:
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
如果您只需要日期的整数部分,那么解决方案之一就是删除日期值中的分隔符,例如:- '/'、'-'、':' 和 ' ' space从日期开始,您将获得具有所需格式的日期:-
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
如果业务害怕客户端无法正确处理datetime
等复杂数据类型而想使用简单int
,至少使用标准方式将日期存储为[=14] =].
将日期存储为简单 int
的一种广泛传播的方法是 unix 时间。它始终是 UTC。它只是自 1970-01-01 以来经过的秒数。在任何情况下都应该使用 bigint
,而不是 int
。尽管如此,我还是会在数据库中将日期存储为 datetime
并在与客户交谈时将其转换为 unix 时间或从 unix 时间转换。
从 Unix 时间转换为日期时间:
DATEADD(second, [unixtime_value], '19700101')
从日期时间转换为 unix 时间:
DATEDIFF(second, '19700101', [datetime_value])
而不是CURRENT_TIMESTAMP
使用GETUTCDATE
获取当前UTC时间然后将其转换为bigint
:
DATEDIFF(second, '19700101', GETUTCDATE())
使用 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 值以有效地获得最佳数据。简单地说,企业担心这会以不同的格式返回。
已编辑:
这是完整度的完整触发器:
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
如果您只需要日期的整数部分,那么解决方案之一就是删除日期值中的分隔符,例如:- '/'、'-'、':' 和 ' ' space从日期开始,您将获得具有所需格式的日期:-
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
如果业务害怕客户端无法正确处理datetime
等复杂数据类型而想使用简单int
,至少使用标准方式将日期存储为[=14] =].
将日期存储为简单 int
的一种广泛传播的方法是 unix 时间。它始终是 UTC。它只是自 1970-01-01 以来经过的秒数。在任何情况下都应该使用 bigint
,而不是 int
。尽管如此,我还是会在数据库中将日期存储为 datetime
并在与客户交谈时将其转换为 unix 时间或从 unix 时间转换。
从 Unix 时间转换为日期时间:
DATEADD(second, [unixtime_value], '19700101')
从日期时间转换为 unix 时间:
DATEDIFF(second, '19700101', [datetime_value])
而不是CURRENT_TIMESTAMP
使用GETUTCDATE
获取当前UTC时间然后将其转换为bigint
:
DATEDIFF(second, '19700101', GETUTCDATE())