如何将SQL Server的时间戳列转换为日期时间格式


88

随着SQL Server返回时间戳,如'Nov 14 2011 03:12:12:947PM',是否有一些简单的方法可以将字符串转换为日期格式,例如'Ymd H:i:s'。

到目前为止,我使用

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))

Answers:


250

SQL Server的TIMESTAMP数据类型与日期和时间无关

它只是一个连续的8字节整数的十六进制表示形式-仅用于确保自读取一行以来该行没有发生变化。

您可以读取十六进制整数,也可以读取BIGINT。举个例子:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

结果是

400756068

在较新版本的SQL Server中,它被称为RowVersion-因为它的确如此。请参阅ROWVERSION上MSDN文档

是一种数据类型,它公开了数据库中自动生成的唯一二进制数。rowversion通常用作版本标记表行的机制。rowversion数据类型只是一个递增数字,并不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。

因此,您无法将SQL ServerTIMESTAMP转换为日期/时间-它不是日期/时间。

但是,如果您说的是时间戳,但实际上您的意思是一DATETIME栏-那么您可以使用MSDN帮助中CAST和CONVERT主题中描述的任何有效日期格式。那些是由SQL Server定义和支持的。不支持其他任何方式,例如,您必须进行大量手动转换和连接(不推荐)。

您要查找的格式有点像ODBC规范(样式= 121):

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

给出:

2011-11-14 10:29:00.470

SQL Server 2012最终将具有FORMAT执行自定义格式功能……


5
可能是我最大的SQL Server烦恼。如果我不能说出时间,为什么还要称它为时间戳?
BelgoCanadian

1
@BelgoCanadian:问Sybase-这是Sybase / SQL Server中永远存在的功能.....
marc_s

1
@BelgoCanadian你应该很高兴知道它现在被称为rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/...
贾森小号

TIMESTAMP类型列
Ghilteras

4

最简单的方法是:

SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`;

这使date列至少具有可读格式。此外,如果您想更改格式,请单击此处


11
问题是SQLServer,而不是MySQL
Mike M

4

使用强制转换可以从时间戳字段获取日期:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
这似乎不起作用:Explicit conversion from data type timestamp to date is not allowed.
jocull

馊主意。时间戳字段只是一个序列。您可能会很幸运并得到一个约会,但该日期将毫无意义。如果要十进制数而不是十六进制,则应强制转换为BIGINT。时间戳现在被称为rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/...
贾森小号

3

我的同事帮助了我:

select CONVERT(VARCHAR(10), <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(VARCHAR(10), <tms_column>, 112);

要么

select CONVERT(DATE, <tms_column>, 112), count(*)
from table where <tms_column> > '2012-09-10'
group by CONVERT(DATE, <tms_column>, 112);

3

工作正常,除了以下消息:

不允许从数据类型varchar隐式转换为时间戳。使用CONVERT函数运行此查询

是的,TIMESTAMPRowVersion不是日期:)

老实说,我自己花了相当长的时间来寻找一种将日期转换为日期的方法。

最好的方法是将其转换为INT并进行比较。这就是这种类型的意思。

如果您想约会-只需添加一Datetime列,然后就可以愉快地生活了:)

欢呼声


1
还是BIGINT,因为它是8个字节
Jason S,

2

“你一直在使用这个词。我认为这并不意味着你认为的意思。” —英戈·蒙托亚

时间戳与marc_s最初所说的绝对不相关。

declare @Test table (
     TestId int identity(1,1) primary key clustered
    ,Ts     timestamp
    ,CurrentDt datetime default getdate()
    ,Something varchar(max)
)

insert into @Test (Something)
    select name from sys.tables
waitfor delay '00:00:10'

insert into @Test (Something)
    select name from sys.tables

select * from @Test

注意,在输出中,每个记录的Ts(十六进制)增加1,但是实际时间间隔为10秒。如果与时间有关,则时间戳中将存在与时间差相对应的间隔。


0

在将转换立即转换为整数CONVERT(BIGINT,[timestamp])作为时间戳后,我得到了如下结果

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

是的,这不是日期和时间,是序列号


0

对我来说有效:TO_DATE('19700101','yyyymmdd')+(TIME / 24/60/60)(oracle DB)


0

我在时间戳上遇到了相同的问题,例如:“ 29-JUL-20 04.46.42.000000000 PM”。我想将其转换为“ yyyy-MM-dd”格式。最终对我有用的解决方案是

从mytable中选择TO_CHAR(mytimestamp,'YYYY-MM-DD');


0

我将假定您已经完成了作为插入语句的数据转储,并且您(或Google的任何人)都在试图弄清日期和时间,或将其翻译以供其他地方使用(例如:转换为MySQL插入)。在任何编程语言中,这实际上都很容易。

让我们一起工作:

CAST(0x0000A61300B1F1EB AS DateTime)

该十六进制表示实际上是两个单独的数据元素...日期和时间。前四个字节是日期,后四个字节是时间。

  • 日期是0x0000A613
  • 时间是0x00B1F1EB

使用您选择的编程语言将这两个段都转换为整数(这是直接十六进制到整数的转换,每种现代编程语言都支持这种转换,因此,我不会在可能是也可能不是编程语言的代码上浪费空间您正在工作)。

  • 0x0000A613的日期变为42515
  • 0x00B1F1EB的时间变为11661803

现在,如何处理这些整数:

日期

日期从1900年1月1日开始,以天表示。因此,将42515天添加到1900年1月1日,您的结果将是05/27/2016。

时间

时间要复杂一些。以该INT值执行以下操作,以获取自午夜以来的时间(以微秒为单位)(伪代码):

TimeINT=Hex2Int(HexTime)
MicrosecondsTime = TimeINT*10000/3

从那里开始,使用您的语言最喜欢的函数调用将微秒(在上面的示例中为38872676666.7 µs)转换为时间。

结果将是10:47:52.677


-1

SQL Server 2008开始,其中一些实际上确实隐瞒了日期时间。

尝试以下SQL查询,您将自己看到:

SELECT CAST (0x00009CEF00A25634 AS datetime)

以上将导致结果,2009-12-30 09:51:03:000但我遇到了实际上未映射到日期时间的内容。


1
不要那样做 您可能会很幸运并获得转换,但是日期时间将毫无意义且具有误导性。时间戳只是一个序列号,现在称为行版本docs.microsoft.com/en-us/sql/t-sql/data-types/…。如果您想将十进制数强制转换为BIGINT
Jason S,


-3

不知道我是否在这里遗漏了一些东西,但是您不能像这样转换时间戳吗:

CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)

你有尝试过吗?TIMESTAMP与DATE没有关系。
肖恩·皮尔斯

我使用的是SQL Server 2008上
丹尼尔

同样,请勿尝试强制转换为日期时间。它只是十六进制形式的整数序列。刚投给BIGINT。
杰森S
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.