DateTime从.net到SQL中的smalldatetime -如何做查询

本文关键字:何做 查询 smalldatetime 中的 net SQL DateTime | 更新日期: 2023-09-27 17:50:20

我有一个DateTime组件在我的代码,我想用它来查询我的SQL Server数据库。

插入此组件时,似乎没有问题,但当查询smalldatetime值时,我只是不知道如何做到这一点。数据集始终为空。

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "ReadDates"; 
dataset = new DataSet();
SqlParameter parameter = new SqlParameter("@date", SqlDbType.SmallDateTime);
parameter.Value = DateTime.Now();
cmd.Parameters.Add(parameter);
dataAdapter = new SqlDataAdapter(cmd);
dataAdapter.Fill(dataset);
return dataset;

在我的存储过程中:

select * from TableDates
where ValueDate <= @date

所以我在SQL Server管理工作室中运行过程没有问题,当以这种格式输入参数时:'2000-03-03 04:05:01',但是当传递DateTime时,查询总是空的。有什么建议吗?

DateTime从.net到SQL中的smalldatetime -如何做查询

我尝试使用SQL Server 2008 R2 Express。

下面是我编写的存储过程示例:

CREATE PROCEDURE [dbo].[ShowGivenSmallDateTimeValue] 
    @givenSmallDateTime smalldatetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Simply return the given small date time value back to sender.
    SELECT @givenSmallDateTime
END

下面是执行这个过程的c#代码:

var connectionBuilder = new SqlConnectionStringBuilder();
connectionBuilder.DataSource = "localhost''sqlexpress";
connectionBuilder.IntegratedSecurity = true;
var now = DateTime.UtcNow;
using (var connection = new SqlConnection(connectionBuilder.ConnectionString))
using (var command = new SqlCommand())
{
    command.Connection = connection;
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "ShowGivenSmallDateTimeValue";
    command.Parameters.Add(new SqlParameter("@givenSmallDateTime", SqlDbType.SmallDateTime) { Value = now });
    connection.Open();
    var result = (DateTime)command.ExecuteScalar();
    var difference = result - now;
    Console.WriteLine("Due to the smalldatetime roundings we have a difference of " + difference + ".");
}

它很好用

下面是我为Datetime创建SqlParameter的代码;对于SQL Server 2008,我们将值传递为datetime2,因为SQL会隐式地将datetime2转换为任何其他日期类型,只要它在目标类型范围内…

            // Default conversion is now DateTime to datetime2. The ADO.Net default is to use datetime. 
            // This appears to be a safe change as any datetime parameter will accept a datetime2 so long as the value is within the
            // range for a datetime. Hence this code is acceptable for both datetime and datetime2 parameters, whereas datetime is not 
            // (because it doesn't handle the full range of datetime2).
            SqlParameter sqlParam = new SqlParameter(name, SqlDbType.DateTime2);

由于您的参数在日期和月份部分包含零…SQL server转换它,但不匹配到您的日期....例如,

如果DATETIME.now()返回'2000-03-03 04:05:01'…它被转换成2000-3-3,不包括零…所以你还需要指定零来匹配你的日期。