将C#日期时间值与SQL Server Compact 4日期时间进行比较

本文关键字:日期 时间 Compact 比较 SQL Server | 更新日期: 2023-09-27 18:20:25

我正在构建一个应用程序,该应用程序存储一组日期时间,以跟踪打印特定报告的时间。该报告由第二个表中的信息组成,该表也有日期时间。我正试图让报表用第一个表中最后一个日期时间之后的记录填充数据网格视图。

第一个表称为"deliverylog",此表存储过去的打印日期。第二个表称为"joblog",它存储以前作业条目的记录。

当我运行该程序时,它运行得很好,并用最后一个日期之后的所有记录填充网格视图,但它没有经过优化。。。它只填充日期之后的日期,而不填充时间。我需要查询来将网格视图填充到第二个。。。。

DateTime lastDeliveryDate;
private void getLastDelivery() // Sets global variable lastDeliveryDate to the last timestamp entered in the deliverylog table 
{
    openLogConnection();
    try
    {
        command = new SqlCeCommand("SELECT TOP 1 * FROM deliverylog ORDER BY Id DESC", logConn);
        drLogSet = command.ExecuteReader();
        while (drLogSet.Read())
        {
            lastDeliveryDate = Convert.ToDateTime(drLogSet["Timestamp"]);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        logConn.Close();
    }
}
private void populateGridView()
{
    openLogConnection();
    try
    {
        command = new SqlCeCommand("SELECT * FROM joblog WHERE TimeStamp > @date", logConn);
        command.Parameters.AddWithValue("@date", lastDeliveryDate);
        dtLogSet = new DataTable();
        bsLogSet = new BindingSource();
        daLogSet = new SqlCeDataAdapter(command);
        cbLogSet = new SqlCeCommandBuilder(daLogSet);
        daLogSet.Fill(dtLogSet);
        bsLogSet.DataSource = dtLogSet;
        dataGridView1.DataSource = bsLogSet;
        dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        logConn.Close();
    }
}

有人知道如何让它正常工作吗?我将这两个表的时间戳存储为日期时间数据类型,格式如下:"MM/dd/yyyy hh:MM:ss tt"

将C#日期时间值与SQL Server Compact 4日期时间进行比较

我认为使用AddWithValue方法在内部转换值,可能会失去所需的时间精度。相反,使用Parameters集合的Add(String, SqlDbType)方法重载:

var dateParameter = command.Parameters.Add("@date", SqlDbType.DateTime);
dateParameter.Value = this.lastDeliveryDate;

在使用调试器检查变量以设置参数值之前,请确保您具有正确的值。

您可以尝试使用DATEDIFF SQL函数而不是>运算符来确保正确的精度:

SELECT * FROM joblog WHERE DATEDIFF(second, @date, TimeStamp) > 0

问题是可能此行:

lastDeliveryDate = Convert.ToDateTime(drLogSet["Timestamp"]);

假设您的TimeStamp字段是datetime类型,您应该使用:

lastDeliveryDate = (DateTime) drLogSet["TimeStamp"];

请确认您的TimeStamp字段的数据类型。

您应该将日期格式化为yyyyMMdd hh:mm:ss。

lastDeliveryDate.toString("yyyyMMdd hh:mm:ss")。

在这篇文章中有更多的细节。如何比较sqlite TIMESTAMP值