在WHERE子句中使用datetime执行查询

时间:2010-10-05 17:41:00

标签: c# sql-server sql-server-2008 .nettiers

我使用sql server 2008 R2作为数据存储。

到目前为止,在测试机上我使用了该软件的英文版,并用于将日期时间字段格式化为

fromDate.ToString("MM/dd/yyyy");

现在我已将数据库部署在另一台意大利语服务器上。我将把代码中的格式更改为

fromDate.ToString("dd/MM/yyyy");

有没有办法以中性格式进行查询?

谢谢!

修改

我忘了提到我正在使用NetTiers和CodeSmith。这是一个完整的样本

AppointmentQuery aq = new AppointmentQuery(true, true);
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate.ToString("MM/dd/yyyy"));
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate.ToString("MM/dd/yyyy"));
AppointmentService aSvc = new AppointmentService();
TList<Appointment> appointmentsList = aSvc.Find(aq);

3 个答案:

答案 0 :(得分:4)

<击> 您应该共享用于执行查询的代码,但我猜您正在使用字符串连接动态构建SQL查询来构建查询和参数。您应该使用参数化查询,然后您可以将数据作为日期对象传递,而无需转换字符串。

例如,如果您的查询可能是这样的

DateTime fromDate = DateTime.Now;

SqlCommand cmd = new SqlCommand(
  "select * from Orders where fromDT = @fromDate", con);

cmd.Parameters.AddWithValue("@fromDate", fromDate);

...

作为良好的副作用,这将降低您SQL injection的风险。 更新:您的编辑确实会显着改变问题背景,我不得不承认我对.netTiers项目有零知识。但出于好奇,您是否尝试过直接传递日期实例,如下所示?

AppointmentQuery aq = new AppointmentQuery(true, true); 
aq.AppendGreaterThan(AppointmentColumn.AppointmentDate, fromDate); 
aq.AppendLessThan(AppointmentColumn.AppointmentDate, toDate); 
AppointmentService aSvc = new AppointmentService(); 
TList<Appointment> appointmentsList = aSvc.Find(aq); 

答案 1 :(得分:2)

ISO 8601 Data elements and interchange formats — Information interchange — Representation of dates and times同时允许YYYY-MM-DD和YYYYMMDD。 SQL Server识别ISO规范。

  

虽然标准允许两者兼而有之   YYYY-MM-DD和YYYYMMDD格式   完整的日历日期   表示,如果[DD]是   省略然后只有YYYY-MM格式   被允许。禁止日期   形式YYYYMM,标准避免   与截断的混淆   代表YYMMDD(仍然经常   使用)。

我更喜欢YYYYMMDD格式,但我认为这是因为我只知道这一点,并且对我而言似乎更具普遍性,已经废除了可能被认为是特定于语言环境的字符。

答案 2 :(得分:1)

就个人而言,我总是使用yyyy-MM-dd。这也使它可以作为字符串排序。

但是,日期是日期是日期。无需将日期更改为字符串。在.NET中,用户DateTime