【问题标题】:compare DateTime in SqlCommand比较 SqlCommand 中的 DateTime
【发布时间】:2012-11-16 16:25:37
【问题描述】:

我有一个简单的SqlCommand,我想在其中返回指定日期时间范围内的所有记录。 (包括日期和时间)

var dataReader = new SqlCommand(
    @"Select RecordID from RecordTable
    where RecordTable.WorkingDT between '"+ _startDt +"' and '"+ _endDt +"'",
    _sqlConnection).ExecuteReader();

如何设置_startDt 和_endDt 的值?

【问题讨论】:

    标签: c# .net datetime sqlcommand


    【解决方案1】:

    你可以试试这个:

    var dataReader = new SqlCommand(
        @"Select RecordID from RecordTable
        where RecordTable.WorkingDT between '"+ _startDt.ToString("yyyy-MM-dd HH:mm:ss") +"' and '"+ _endDt.ToString("yyyy-MM-dd HH:mm:ss") +"'",
        _sqlConnection).ExecuteReader();
    

    其中_startDt 和_endDt 是日期时间类型。

    【讨论】:

      【解决方案2】:

      如果您将它们作为适当的参数添加到命令中,则无需担心格式问题。养成使用这些习惯的额外好处是,当您将字符串作为参数提供时,您不必担心 SQL 注入。

      看看http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06

      它展示了如何在查询中使用参数。我不认为它需要完全拼写出来。

      一个例子(从网站复制/粘贴):

      // 1. declare command object with parameter
      SqlCommand cmd = new SqlCommand(
          "select * from Customers where city = @City", conn);
      
      // 2. define parameters used in command object
      SqlParameter param  = new SqlParameter();
      param.ParameterName = "@City";
      param.Value         = inputCity;
      
      // 3. add new parameter to command object
      cmd.Parameters.Add(param);
      
      // get data stream
      reader = cmd.ExecuteReader();
      

      是的,定义参数可以缩短到每个参数 3 行。但这取决于读者。

      【讨论】:

        【解决方案3】:

        @kmatyaszek,虽然“yyyy-mm-dd HH:mm:ss”日期格式很常用,但不能保证被 SQL 服务器明确解析。如果您必须从连接字符串创建 SQL(在这种情况下不是必要的,正如 René 所示),那么您应该使用 ISO8601 格式,它是相同的,但中间有一个 T:“yyyy-mm-ddTHH:mm:ss ”。

        http://msdn.microsoft.com/en-us/library/ms190977%28v=sql.90%29.aspx

        “使用 ISO 8601 格式的优点是它是 国际标准。此外,由指定的日期时间值 使用这种格式是明确的。此外,此格式不受影响 通过 SET DATEFORMAT 或 SET LANGUAGE 设置。”

        为了演示为什么,试试这个可重新运行的 Sql 脚本。

        if object_id('tempdb..#Foo') is not null drop table #Foo;
        create table #Foo(id int, d datetime)
        
        -- Intend dates to be 12th Jan.
        set dateformat ymd
        insert into #Foo(id, d) values (1, '2012-01-12 01:23:45')   -- ok
        insert into #Foo(id, d) values (2, '2012-01-12T01:23:45')   -- ok
        set dateformat ydm
        insert into #Foo(id, d) values (3, '2012-01-12 01:23:45')   -- wrong!
        insert into #Foo(id, d) values (4, '2012-01-12T01:23:45')   -- ok
        
        select * from #Foo order by id
        
        if object_id('tempdb..#Foo') is not null drop table #Foo;
        

        【讨论】:

          猜你喜欢
          • 2011-01-11
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-20
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多