由于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'))
答案 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函数运行此查询
是的,TIMESTAMP
(RowVersion
)不日期:)
说实话,我在很长一段时间内都在试图找到一种方法将其转换为约会。
最好的方法是将其转换为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)
答案 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)
此十六进制表示实际上是两个单独的数据元素...日期和时间。前四个字节是日期,后四个字节是时间。
使用您选择的编程语言将两个段都转换为整数(这是直接十六进制到整数的转换,每种现代编程语言都支持这种转换,因此,我不会浪费可能会或可能不会您正在使用的编程语言)。
现在,如何处理这些整数:
日期
日期自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()