随着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:
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
执行自定义格式的功能……
TIMESTAMP
类型列
使用强制转换可以从时间戳字段获取日期:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
Explicit conversion from data type timestamp to date is not allowed.
我的同事帮助了我:
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);
“你一直在使用这个词。我认为这并不意味着你认为的意思。” —英戈·蒙托亚
时间戳与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秒。如果与时间有关,则时间戳中将存在与时间差相对应的间隔。
对我来说有效:TO_DATE('19700101','yyyymmdd')+(TIME / 24/60/60)(oracle DB)
我将假定您已经完成了作为插入语句的数据转储,并且您(或Google的任何人)都在试图弄清日期和时间,或将其翻译以供其他地方使用(例如:转换为MySQL插入)。在任何编程语言中,这实际上都很容易。
让我们一起工作:
CAST(0x0000A61300B1F1EB AS DateTime)
该十六进制表示实际上是两个单独的数据元素...日期和时间。前四个字节是日期,后四个字节是时间。
使用您选择的编程语言将这两个段都转换为整数(这是直接十六进制到整数的转换,每种现代编程语言都支持这种转换,因此,我不会在可能是也可能不是编程语言的代码上浪费空间您正在工作)。
现在,如何处理这些整数:
日期
日期从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
从SQL Server 2008开始,其中一些实际上确实隐瞒了日期时间。
尝试以下SQL查询,您将自己看到:
SELECT CAST (0x00009CEF00A25634 AS datetime)
以上将导致结果,2009-12-30 09:51:03:000
但我遇到了实际上未映射到日期时间的内容。
为什么不尝试FROM_UNIXTIME(unix_timestamp, format)
?