我有一个存储在SQL服务器中的高精度日期,例如
2009-09-15 19:43:43.910
但是,当我将该值转换为DateTime时,生成的DateTime值的毫秒值为0:
reader["Timestamp"] = 15/09/2009 19:43:43.000
将这些DateTime值精确到毫秒级对我来说非常重要 - 这样做的最佳方式是什么?
更新:这是执行转换的代码:
DateTime myDate = (DateTime)reader[Timestamp"];
SELECT
声明没有什么特别之处,事实上它是SELECT *
- 没有花哨的演员表或其他任何东西
SqlDataReader
返回的DateTime对象似乎没有填充Millisecond值
答案 0 :(得分:16)
我遇到了同样的问题,经过一些阅读后发现,当你正在检索日期时
DateTime myDate = (DateTime)reader["Timestamp"];
SQLDataReader会丢弃毫秒。但是,如果您使用SQLDataReader的GetDateTime方法,它将返回一个保留毫秒的DateTime对象:
reader.GetDateTime(reader.GetOrdinal("Timestamp"));
答案 1 :(得分:6)
答案 2 :(得分:5)
这是因为DateTime的默认格式字符串不包括毫秒。
如果您使用自定义格式,则会看到毫秒值。
一个例子:
public class Program
{
private static string connString = @"Data Source=(local);Initial Catalog=DBTest;Integrated Security=SSPI;";
public static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM MilliSeconds"))
{
cmd.Connection = conn;
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
DateTime dt = (DateTime)reader["TimeCollected"];
int milliSeconds = dt.Millisecond;
Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
}
}
Console.ReadLine();
}
}
来自具有以下值的数据库:
1 2009-09-22 18:11:12.057
2 2009-09-22 18:11:28.587
3 2009-09-22 18:11:29.820
上述代码的结果输出是:
2009-09-22 18:11:12.057
2009-09-22 18:11:28.587
2009-09-22 18:11:29.820
答案 3 :(得分:0)
我遇到了同样的问题,我通过将C#DateTime作为填充 DateTime.Ticks 的SQL bigint 来解决它。这样可以保留完整的DateTime精度。当然可以使用 DateTime(长标记)构造函数进行反序列化。
答案 4 :(得分:-1)
以下是我尝试解决此问题的方法:
在调试器中单步执行并查看reader [Timestamp“]的类型和值。如果类型不是SqlDateTime,那会让我产生怀疑 - 然后我会查看查询来弄清楚为什么该列返回另一种类型而不是DATETIME(或DATETIME2等)
如果该值是SqlDateTime并且它确实包含毫秒,那么我会将转换视为问题的根源。为了验证这一点,我尝试(在调试器或代码中)SqlDataReader.GetDateTime()和SqlDataReader.GetSqlDateTime()来查看是否返回正确的结果。事实上这似乎不太可能是问题的根源 - 铸造应该工作正常。
如果来自#1的值是SqlDateTime但不包含毫秒,那么我会查看数据库中的上游问题 - 换句话说,您的查询返回的内容没有毫秒。当你在Management Studio中执行完全相同的查询时,你看到毫秒?
我的猜测是这是一个与查询相关的问题。但我很想找到更多。