我为我的客户创建应用程序,当应用程序部署到其他计算机时,我通常会遇到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();
答案 0 :(得分:3)
首先,如果您的order_date
列为datetime
类型,则不应将其传递给DateTime
值的字符串表示形式。当然,您需要使用parameterized queries直接传递 {/ 1}}的值。因为这种字符串连接对SQL Injection攻击是开放的。
如果您的DateTime
列是字符类型,会将其更改为order_date
。字符类型列(DateTime
,varchar
等)适用于字符,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