T-Sql 中的时间戳在 C# 中是啥意思?
Posted
技术标签:
【中文标题】T-Sql 中的时间戳在 C# 中是啥意思?【英文标题】:What does a timestamp in T-Sql mean in C#?T-Sql 中的时间戳在 C# 中是什么意思? 【发布时间】:2011-09-14 03:42:51 【问题描述】:我正在尝试开发一个模型对象来保存一个 Sql Server 行,除了 T-Sql/SqlServer 时间戳之外,我完全理解如何做到这一点。该表定义为:
CREATE TABLE activity (
activity_id int
, ip_address varchar(39)
, user_id varchar(255)
, message_text
, dt timestamp
)
当我将表格行解析为对象时,对于 int 或字符串,我希望执行以下操作:
ActivityID = (int)dataReader["activity_id"];
IPAddress = (string)dataReader["ip_address"];
但是我该怎么处理时间戳列呢?我在任何地方都找不到“时间戳”数据类型。我知道 Sql Server 将时间戳存储为 8 字节二进制文件,但这通常相当于 .NET 中的什么?
编辑添加: 一点额外信息...这是从我们大型机上的 DB2 表返回的一行,该表通过 Sql Server 视图传来。 “Rowversion”不是一个选项,DB2 将该列作为时间戳传递。如果时间戳和行版本相同,也许我可以将其视为一个,否则我会被时间戳卡住。
再次编辑添加:这个项目会让我发疯。至少,这将是一次短途旅行。无论如何,是的@JoelC 这是大型机上 DB2 数据库的 Sql Server 视图。我终于找到了我们的一位 DBA,他轻蔑地解释说,“当然”DB2 TIMESTAMP 将 Sql Server 视图视为日期时间。从他的语气中我猜只有菜鸟不知道这一点。这就是为什么他在实际视图中将其命名为“日期时间”,Duh! (我在示例中给了它一个不同的名称,以免触发对命名约定的评论——实际的数据模型图说它是一个 TIMESTAMP 并将其命名为时间戳)。因此,在这种情况下,显然必须将其转换为 DateTime。我想我可能会开始考虑成为一名 DBA,这样我也可以让程序员发疯。抱歉,如果我在这个问题上误导了任何回复者——这是无意的,因为我实际上希望时间戳是一个时间戳。傻我。特别感谢微软将字节数组数据类型命名为“时间戳”,因为它与日期和时间无关。我不知道哪个响应标记为答案。叹息。
【问题讨论】:
@Michael 这不是 OP 所要求的。我会使用日期时间,顺便说一句DateTime
对象呢,它可以保存你的时间戳。
另见:***.com/questions/425389/…
您应该使用rowversion
而不是timestamp
- 请参阅msdn.microsoft.com/en-us/library/ms182776.aspx
如果我可以控制数据库,这是一个很好的建议,但我没有。这实际上是一个来自 Sql Server 视图的 DB2 表。
【参考方案1】:
根据this post
您必须将其转换为字节数组。
byte[] dt = dataReader["dt"] as byte[];
【讨论】:
【参考方案2】:Sql Server 时间戳数据类型的名称令人困惑。最好将它想象成一个版本号——那里没有任何日期/时间信息。事实上,从 Sql Server 2008 开始,该类型已重命名为“rowversion”。
大多数情况下,您希望在 Sql Server 中使用 datetime
类型,它可以轻松映射到 C# 中的 DateTime,或者如果您有支持它的 Sql Server 版本,则可能是 datetime2。关于时间戳类型的文档在这里:http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx
如果您真的必须按原样映射该时间戳列,则最接近的匹配可能是普通的旧 long
(或者可能是 ulong),但我不知道 sql server 如何处理字节排序或大/小字节序与C#。
【讨论】:
我将把它标记为已接受的答案,因为它是对我认为的问题的正确答案。由于我的基本假设是错误的,因此问题变得不同了,在这种情况下,转换为 DateTime 的答案是正确的。【参考方案3】:这是一个byte[]
,其中一个Length
是8
。
【讨论】:
【参考方案4】:从数据库中检索时
string dt = Convert.ToBase64String(dataReader["dt"] as byte[]);
传入数据库时
new SqlParameter("@dt", Convert.FromBase64String(dt))
【讨论】:
以上是关于T-Sql 中的时间戳在 C# 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 Big Query 中的 UTC 时间戳在 Data Studio 中显示本地时区的日期/时间