【问题标题】: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;