如何在不同计算机中的c#和SQL Server之间修复日期时间表单

时间:2014-08-22 11:08:21

标签: c# sql sql-server datetime

我为我的客户创建应用程序,当应用程序部署到其他计算机时,我通常会遇到DateTime转换问题。

在Winforms中,我有用户的日期选择器控件。用户选择日期并单击按钮,然后我对SQL Server执行SQL查询。我使用所选日期过滤SELECT。但由于区域设置,我通常会在其他计算机上遇到DateTime转换问题。

是否可以在C#和SQL Server之间修复DateTime格式,有时,SQL Server可以位于主服务器上,用户可以在其客户端计算机中使用我的应用程序。有些SQL Server接受2014-08-20,有些接受20-08-2014。如何为每个人修复此日期时间?

示例代码:

DateTime date_ = DateTime.Today;
.....
.....
sql = "select * from table where order_date="+date_.ToShortDateString();

3 个答案:

答案 0 :(得分:3)

首先,如果您的order_date列为datetime类型,则不应将其传递给DateTime值的字符串表示形式。当然,您需要使用parameterized queries直接传递 {/ 1}}的值。因为这种字符串连接对SQL Injection攻击是开放的。

如果您的DateTime列是字符类型,会将其更改为order_date 。字符类型列(DateTimevarchar等)适用于字符,nvarchar类型列适用于datetime

没有必要将DateTime保存为DateTime'

作为旁注;在C#中的DateTime中没有任何隐式格式。它只是包含一段时间的值。它的字符串表示具有格式。

答案 1 :(得分:3)

SQL Server支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。大多数格式都是依赖你所拥有的设置 - 因此,这些设置可能会有效 - 有时也不会。

解决此问题的方法是使用SQL Server支持的(略微调整的) ISO-8601日期格式 - 此格式始终 - 无论您的是什么SQL Server语言和日期格式设置。

SQL Server支持ISO-8601 format有两种形式:

  • YYYYMMDD仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD 独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!

或:

  • YYYY-MM-DDTHH:MM:SS了解日期和时间 - 请注意:此格式破折号(但可以可以省略),还有一个固定的T作为DATETIME的日期和时间部分之间的分隔符。

这适用于SQL Server 2000及更高版本。

如果您使用SQL Server 2008或更高版本以及DATE数据类型(仅DATE - DATETIME!),那么您确实也可以使用YYYY-MM-DD格式,也适用于SQL Server中的任何设置。

不要问我为什么这整个话题如此棘手而且有点令人困惑 - 这就是它的方式。但是使用YYYYMMDD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。

对于SQL Server 2008及更高版本的建议是,如果您只需要日期部分,则使用DATE,当需要日期和时间时,使用DATETIME2(n)。您应该尽可能尝试开始逐步淘汰DATETIME数据类型

因此,如果你必须使用基于字符串的日期格式 - 使用 ISO-8601 格式 - 但正如SonerGönül已经提到的那样 - 当使用来自C#的查询时,请尝试使用DateTime作为参数 - 并不总是将所有内容转换为字符串!

答案 2 :(得分:0)

您只需在文本中使用带月份的日期

即可
DateTime date_ = DateTime.Today;
.....
.....
sql = "select * from table where order_date='"+date_.ToString("dd/MMM/yyyy")+"'";

或将日期转换为SQL datetime

sql = "select * from table where order_date=CONVERT(DATETIME, '"+date_.ToString("yyyy-MM-dd")+"', 102)";

这里是SQL

的日期时间函数列表
select CONVERT(VARCHAR(12),getdate(),100) +' '+ 'Date -100- MMM DD YYYY' -- Feb 5 2010
select CONVERT(VARCHAR(10),getdate(),101) +' '+ 'Date -101- MM/DDYYYY'
select CONVERT(VARCHAR(10),getdate(),102) +' '+ 'Date -102- YYYY.MM.DD'
select CONVERT(VARCHAR(10),getdate(),103) +' '+ 'Date -103- DD/MM/YYYY'
select CONVERT(VARCHAR(10),getdate(),104) +' '+ 'Date -104- DD.MM.YYYY'
select CONVERT(VARCHAR(10),getdate(),105) +' '+ 'Date -105- DD-MM-YYYY'
select CONVERT(VARCHAR(11),getdate(),106) +' '+ 'Date -106- DD MMM YYYY' --ex: 03 Jan 2007
select CONVERT(VARCHAR(12),getdate(),107) +' '+ 'Date -107- MMM DD,YYYY' --ex: Jan 03, 2007
select CONVERT(VARCHAR(12),getdate(),109) +' '+ 'Date -108- MMM DD YYYY' -- Feb 5 2010
select CONVERT(VARCHAR(12),getdate(),110) +' '+ 'Date -110- MM-DD-YYYY' --02-05-2010
select CONVERT(VARCHAR(10),getdate(),111) +' '+ 'Date -111- YYYY/MM/DD'
select CONVERT(VARCHAR(12),getdate(),112) +' '+ 'Date -112- YYYYMMDD' -- 20100205
select CONVERT(VARCHAR(12),getdate(),113) +' '+ 'Date -113- DD MMM YYYY' -- 05 Feb 2010


SELECT convert(varchar, getdate(), 20) -- 2010-02-05 10:25:14
SELECT convert(varchar, getdate(), 23) -- 2010-02-05
SELECT convert(varchar, getdate(), 24) -- 10:24:20
SELECT convert(varchar, getdate(), 25) -- 2010-02-05 10:24:34.913
SELECT convert(varchar, getdate(), 21) -- 2010-02-05 10:25:02.990


---==================================
-- To get the time
select CONVERT(VARCHAR(12),getdate(),108) +' '+ 'Date -108- HH:MM:SS' -- 10:05:53

select CONVERT(VARCHAR(12),getdate(),114) +' '+ 'Date -114- HH:MM:SS:MS' -- 10:09:46:223
SELECT convert(varchar, getdate(), 22) -- 02/05/10 10:23:11 AM