如何将sql server的时间戳列转换为日期时间格式

cnh2zyt3  于 2021-07-29  发布在  Java
关注(0)|答案(13)|浏览(1198)

因为sql server返回时间戳 'Nov 14 2011 03:12:12:947PM' ,是否有一些简单的方法将字符串转换为日期格式,如“y-m-dh:i:s”。
到目前为止我使用

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

cyej8jka1#

sql server的 TIMESTAMP 数据类型与日期和时间无关!
它只是一个连续的8字节整数的十六进制表示——它只适用于确保一行在被读取后没有改变。
你可以读出十六进制整数,或者如果你想要一个 BIGINT . 例如:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

结果是

400756068

在较新版本的SQLServer中,它被称为 RowVersion -因为事实就是这样。请参阅行版本上的msdn文档:
是一种数据类型,它公开数据库中自动生成的唯一二进制数。rowversion通常用作表行的版本戳记机制。rowversion数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。
因此不能转换sql server TIMESTAMP 日期/时间-这不是日期/时间。
但如果你说的是时间戳,但实际上你指的是 DATETIME 列-然后可以使用msdn帮助中“转换和转换”主题中描述的任何有效日期格式。sql server“开箱即用”定义并支持这些。不支持任何其他操作,例如,必须执行大量手动强制转换和连接(不推荐)。
您要查找的格式有点像odbc规范(style=121):

DECLARE @today DATETIME = SYSDATETIME()

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

给予:

2011-11-14 10:29:00.470

sql server 2012最终将有一个 FORMAT 用于自定义格式的函数。。。。。。

koaltpgm

koaltpgm2#

我的同事帮了我:

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);
jv4diomz

jv4diomz3#

使用cast可以从时间戳字段获取日期:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name
ryevplcw

ryevplcw4#

最简单的方法是:

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

这使日期列至少具有可读的格式。如果您想进一步更改te格式,请单击此处。

i1icjdpr

i1icjdpr5#

工作正常,除了以下信息:
不允许从数据类型varchar隐式转换为时间戳。使用convert函数运行此查询
所以是的, TIMESTAMP ( RowVersion )不是日期:)
老实说,我自己也花了不少时间想办法把它变成约会。
最好的办法是把它转换成 INT 比较一下。这就是这种类型的含义。
如果你想约会-只要加个 Datetime 专栏,从此幸福生活:)
干杯,麦克

eiee3dmh

eiee3dmh6#

“你一直用这个词。我不认为这意味着你认为这意味着什么
时间戳与时间完全没有关系,正如marc\u最初所说。

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(hex)为每条记录增加1,但实际时间间隔为10秒。如果它与时间有关,那么时间戳中会有一个缺口,与时间的差异相对应。

ulydmbyx

ulydmbyx7#

在转换为整数convert(bigint,[timestamp])作为时间戳之后,我得到如下结果
446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126
是的,这不是日期和时间,是序列号

sgtfey8w

sgtfey8w8#

for me works:to_date('19700101','yyyyymmdd')+(time/24/60/60)(oracle数据库)

flmtquvp

flmtquvp9#

我对时间戳也有同样的问题,例如:'29-jul-20 04.46.42.000000000 pm'。我想把它变成'yyyy-mm-dd'格式。最终对我有效的解决方案是
从mytable中选择to_char(mytimestamp,'yyyy-mm-dd');

aij0ehis

aij0ehis10#

我假设您已经将数据转储为insert语句,并且您(或者google上的任何人)正试图找出日期和时间,或者将其转换为其他地方使用(例如:转换为mysql insert)。这在任何编程语言中都是很容易的。
让我们来处理这个问题: CAST(0x0000A61300B1F1EB AS DateTime) 这个十六进制表示实际上是两个独立的数据元素。。。日期和时间。前四个字节是日期,后四个字节是时间。
日期为0x0000a613
时间为0x00b1f1eb
使用您选择的编程语言将这两个段转换为整数(这是一种直接的十六进制到整数的转换,每种现代编程语言都支持这种转换,因此,我不会浪费空间编写可能是您正在使用的编程语言,也可能不是您正在使用的编程语言的代码)。
0x0000a613的日期变为42515
0x00b1f1eb的时间变为11661803
现在,如何处理这些整数:
日期
日期自1900年1月1日起,以天表示。所以,把42515天加到1900年1月1日,结果是2016年5月27日。
时间
时间有点复杂。取该int并执行以下操作以获取午夜后的微秒时间(伪代码):

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

在那里,使用您的语言最喜欢的函数调用来翻译微秒(38872676666.7)µ(在上面的例子中)转化为时间。
结果是10:47:52.677

yrwegjxp

yrwegjxp11#

其中一些实际上是从SQLServer2008开始转换为日期时间的。
尝试以下sql查询,您将自己看到:

SELECT CAST (0x00009CEF00A25634 AS datetime)

以上将导致 2009-12-30 09:51:03:000 但我也遇到过一些不符合约会时间的。

vltsax25

vltsax2512#

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

3pvhb19x

3pvhb19x13#

我不确定这里是否遗漏了什么,但你不能这样转换时间戳:

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

相关问题