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

时间:2011-11-14 09:16:15

标签: sql-server datetime timestamp

由于SQL Server返回时间戳如'Nov 14 2011 03:12:12:947PM',有一些简单的方法可以将字符串转换为日期格式,如'Y-m-d H:i:s'。

到目前为止,我使用

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

13 个答案:

答案 0 :(得分:219)

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

它只是一个连续的8字节整数的十六进制表示 - 它只对确保一行在读取后没有变化有好处。

您可以读取十六进制整数,或者如果您想要BIGINT。举个例子:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

结果是

400756068

在较新版本的SQL Server中,它被称为RowVersion - 因为它确实就是这样。请参阅MSDN docs on ROWVERSION

  

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

因此无法将SQL Server TIMESTAMP转换为日期/时间 - 它不是日期/时间。

但是如果你说的是时间戳,但实际上你的意思是DATETIME列 - 那么你可以使用MSDN帮助中CAST and 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 will finally have a FORMAT function进行自定义格式化......

答案 1 :(得分:4)

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

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

答案 2 :(得分: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 :(得分:3)

工作正常,但此消息除外:

  

不允许从数据类型varchar到timestamp的隐式转换。使用CONVERT函数运行此查询

是的,TIMESTAMPRowVersion日期:)

说实话,我在很长一段时间内都在试图找到一种方法将其转换为约会。

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

如果你想要一个约会 - 只需添加一个Datetime专栏,然后就可以幸福地生活:)

欢呼mac

答案 4 :(得分:2)

&#34;你继续使用那个词。我不认为这意味着你的意思。&#34; - Inigo Montoya

时间戳与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秒。如果它与时间有关,则时间戳中会有一个间隙与时间差异相对应。

答案 5 :(得分:1)

为什么不试试FROM_UNIXTIME(unix_timestamp, format)

答案 6 :(得分:1)

最简单的方法是:

mysqli_query()

这使得日期列至少以可读格式提供。 此外,如果您想更改te格式,请单击here

答案 7 :(得分:0)

其中一些实际上确实从 SQL Server 2008 开始转换为日期时间。

尝试以下SQL查询,您将亲眼看到:

SELECT CAST (0x00009CEF00A25634 AS datetime)

以上将导致2009-12-30 09:51:03:000,但我遇到了实际上没有映射到日期时间的那些。

答案 8 :(得分:0)

即将转换为整数后 将CONVERT(BIGINT,[timestamp])用作时间戳 我得到的结果是

  

446701117   446701118   446701119   446701120   446701121   446701122   446701123   446701124   446701125   446701126

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

答案 9 :(得分:0)

对我而言有效: TO_DATE('19700101','yyyymmdd')+(时间/ 24/60/60) (Oracle数据库)

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

让我们一起工作:

CAST(0x0000A61300B1F1EB AS DateTime)

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

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

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

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

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

日期

日期自1900年1月1日以来,以天表示。因此,将42,515天加到1900年1月1日,结果是05/27/2016。

时间

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

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

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

结果将是10:47:52.677

答案 12 :(得分:-3)

不确定我是否在这里遗漏了一些东西,但你不能像这样转换时间戳:

DateTime? date;
date = getDate() == DateTime.MinValue ? null : getDate()