這個問題在這里已經有了答案: 在 C# 中將日期時間轉換為顯示毫秒 (3 個回答) 2 小時前關閉。
以下查詢在 Azure 托管的 SQL 資料庫表上的 MSSSMS 版本 18.1 中按預期作業:
select Name, cast(MAX(DTStamp) as Datetime) AS Last_Seen FROM dbo.MyTable GROUP BY Name
示例輸出:
Fairyflosser29 2021-11-11 19:26:00.323
GoofballAnticz 2021-11-25 14:43:57.443
WeirdAlJankyVic 2021-12-01 19:30:20.341
但是,盡管進行了強制轉換以及我撰寫了強制轉換的方式,但通過以下方法運行的 C# 中的相同 SQL 命令始終會減少 DateTime 欄位中的毫秒數。這對我來說很重要,因為我的后續查詢取決于 DateTime 欄位精確到毫秒的準確性,否則后續查詢不回傳任何內容。
該行程呼叫GetLastSeenList()它回傳一個逗號分隔的記錄串列,這些記錄表示Name表中每個記錄的最新(按日期時間戳)記錄。使用填充的串列,稍后將呼叫另一個方法,該方法使用這些結果為每個專案拉取整行。
因為日期時間戳包括毫秒,所以那些后續查詢必須包括毫秒值,否則即使有記錄查詢也會失敗。
首先,獲取姓名串列以及他們最后一次出現的時間。接下來,為上次看到的串列中的每條記錄提取整行(不包括在此處,因為第一個查詢不提供表中的日期時間 - 毫秒不變)。
我不太擅長 SQL,所以請幫助我理解我在這里遺漏了什么。
筆記
1:
DTStamp列定義為datetime2:我從里到外都試過演員陣容,達到了荒謬的長度,例如:
cast(MAX(cast(GPS_DTStamp as Datetime)) as Datetime) ...
[編輯]:以防萬一不清楚,sql 命令 sqlcmd_GetLastSeenList與頂部的 SSMS 查詢相同:
private static readonly string sqlcmd_GetLastSeenList =
@"select Name, cast(MAX(DTStamp) as Datetime) AS Last_Seen FROM dbo.MyTable GROUP BY Name;";
獲取LastSeen:
internal static async Task<string> GetLastSeenList()
{
StringBuilder sb = new StringBuilder();
var list = await ReadSQL(sqlcmd_GetLastSeenList, false);
if(list != null && list.Count > 0)
{
// Just return a CSV list of ID's with last seen timestamps
foreach(var record in list)
sb.Append($"{record[0]} {record[1]},");
}
return sb.ToString().Trim(',');
}
讀取SQL:
private static async Task<List<object[]>> ReadSQL(string cmdText, bool isProd)
{
List<object[]> response = new List<object[]>();
string connect = string.Empty;
if (isProd)
connect = await SetConnectionProd(_uidProd, _p_pwd);
else
connect = await SetConnectionTest(_uidTest, _t_pwd);
try
{
using (SqlConnection conn = new SqlConnection(connect))
{
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
response = await ExecuteQuery2(cmd, conn);
}
}
}
catch (Exception ex)
{
//TODO: log it
throw ex;
}
return response;
}
執行查詢2:
private static async Task<List<object[]>> ExecuteQuery2(SqlCommand cmd, SqlConnection conn)
{
List<object[]> retval = new List<object[]>();
try
{
object[] myVals = new object[MAXCOLUMNCOUNT];
object[] myRow = null;
cmd.Connection.Open();
using(SqlDataReader sqlreader = cmd.ExecuteReader())
{
if(sqlreader.HasRows)
{
while(sqlreader.Read())
{
var count = sqlreader.GetValues(myVals);
myRow = new object[count];
Array.Copy(myVals, myRow, count);
retval.Add(myRow);
}
}
}
}
catch(Exception ex)
{
throw ex;
}
finally
{
cmd.Connection.Close();
}
return retval;
}
uj5u.com熱心網友回復:
毫秒就在那里。DateTime.ToString() 默認情況下不顯示它們。例如:
var cmd = new SqlCommand("select cast('2021-11-11 19:26:00.323' as datetime) d", con);
using (var rdr = cmd.ExecuteReader())
{
rdr.Read();
var vals = new object[rdr.FieldCount];
rdr.GetValues(vals);
var val = (DateTime)vals[0];
Console.WriteLine($"{val.GetType().Name} {val} {val.ToString("O")}");
}
輸出
DateTime 11/11/2021 7:26:00 PM 2021-11-11T19:26:00.3230000
但也要確保你沒有在datetime和之間來回轉換datetime2,例如這個
select cast(cast('2021-11-11 19:26:00.323' as datetime) as datetime2) d
輸出
d
---------------------------
2021-11-11 19:26:00.3233333
并且這種轉換可能是后續查詢錯誤比較的根源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372367.html
