使用 C # 将 DateTime 格式转换为 SQL 格式

我试图从 C # 保存当前的日期时间格式,并将其转换为 SQL Server 日期格式,如 yyyy-MM-dd HH:mm:ss,这样我就可以使用它进行 UPDATE查询。

这是我的第一个密码:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

按日期输出是可以的,但是时间总是“12:00:00”,因此我将代码更改为以下内容:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " +
myDateTime.TimeOfDay.ToString("HH:mm:ss");

它给了我这个编译错误:

未处理 FormatException

建议我解析一下。因此,我尝试按照我在 StackOverflow 中的研究对我的代码进行这样的处理:

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " +
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

或者

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " +
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

但它告诉我,这是一个方法,对于给定的上下文是无效的。我试图寻找解决问题的方法,但是我已经被困了两个小时了。我在 C # 还是个新手,你能帮帮我吗?

369409 次浏览

试试下面这个

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

您的第一个代码将通过执行此操作来工作

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part

您的问题出现在“ Date”属性中,该属性只截断 DateTime的日期。 你可以这样转换:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

正确的答案已经给出了“使用参数”。格式化日期并将其作为字符串传递给 SQL-Server 可能会导致错误,因为这取决于服务器端如何解释日期的设置。在欧洲,我们写“1.12.2012”表示2012年12月1日,而在其他国家,这可能被视为1月12日。

当直接在 SSMS 中发出语句时,我使用的格式 yyyymmdd似乎相当通用。到目前为止,我所做的各种安装工作都没有遇到任何问题。

还有一种很少使用的格式,有点奇怪,但适用于所有版本:

select { d '2013-10-01' }

将于2013年10月1日返回。

select { ts '2013-10-01 13:45:01' }

将于10月1日下午1:45:01返回

我强烈建议使用参数和 永远不会格式化您自己的 SQL 代码,粘贴在一起自制的格式化语句片段。它是 SQL 注入和奇怪错误的条目(格式化浮点值是另一个潜在的问题)

我想要的答案是:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

我还知道你可以这样做:

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

其中 myCountryDateFormat 可以根据需要更改以满足更改。

请注意,标记为“这个问题可能已经有答案在这里:”没有实际回答的问题,因为你可以看到它使用了一个“。而不是省略日期。对于新的程序员来说,这是相当令人困惑的。NET

为什么不完全跳过字符串:

SqlDateTime myDateTime = DateTime.Now;

使用标准的 datetime 格式“ s”还将确保国际化兼容性(MM/dd 与 dd/MM) :

myDateTime.ToString("s");


=> 2013-12-31T00:00:00

完整选项: (代码: 示例结果)

d: 6/15/2008
D: Sunday, June 15, 2008
f: Sunday, June 15, 2008 9:15 PM
F: Sunday, June 15, 2008 9:15:07 PM
g: 6/15/2008 9:15 PM
G: 6/15/2008 9:15:07 PM
m: June 15
o: 2008-06-15T21:15:07.0000000
R: Sun, 15 Jun 2008 21:15:07 GMT
s: 2008-06-15T21:15:07
t: 9:15 PM
T: 9:15:07 PM
u: 2008-06-15 21:15:07Z
U: Monday, June 16, 2008 4:15:07 AM
y: June, 2008


'h:mm:ss.ff t': 9:15:07.00 P
'd MMM yyyy': 15 Jun 2008
'HH:mm:ss.f': 21:15:07.0
'dd MMM HH:mm:ss': 15 Jun 21:15:07
'\Mon\t\h\: M': Month: 6
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

支持.NET Framework: 4.6,4.5,4,3.5,3.0,2.0,1.1,1.0
参考文献: DateTime.ToString方法

只有你输入“ T”+ 日期时间. Now. ToLongTimeString () +’2015-02-23’

如果希望使用该 DateTime 更新表,可以使用 SQL 字符串,如下例所示:

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}", myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

您的问题出现在仅截断 DateTime到日期的 Date属性中:

DateTime myDateTime = DateTime.Now;


string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

如果要在表中存储当前日期,则可以使用

GETDATE () ;

或者将此函数作为 参数传递

例如 ‘ update tblname set curdate = GETDATE () where colname = 123’

将 DateTime 从 C # 传递到 SQLServer 的另一种解决方案,与 SQLServer 语言设置无关

假设您的区域设置显示的日期为 dd.MM.yyyy (德国标准“104”)

DateTime myDateTime = DateTime.Now;
string sqlServerDate = "CONVERT(date,'"+myDateTime+"',104)";

根据“104”规则考虑映射,将 C # datetime 变量传递给 SQLServer 日期类型变量。SqlServer 日期获取 yyyy-MM-dd

如果“区域设置”显示 DateTime 的方式不同,则使用 SQLServerCONVERT 表中的适当匹配

更多有关规则: https://www.techonthenet.com/sql_server/functions/convert.php

我认为问题在于缺少了两个单引号。

这是我在 MSSMS 上运行的 sql:

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

正如您所看到的,有两个单引号,因此您的代码必须是:

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

在 MSSQL 甚至 MySQL 中对每个字符串使用单引号。我希望这有所帮助。

   DateTime date1 = new DateTime();


date1 = Convert.ToDateTime(TextBox1.Text);
Label1.Text = (date1.ToLongTimeString()); //11:00 AM
Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
Label3.Text = date1.ToString();
Label4.Text = date1.ToShortDateString();
Label5.Text = date1.ToShortTimeString();

让我们使用 SqlDateTime 类中构建的

new SqlDateTime(DateTime.Now).ToSqlString()

但是仍然需要检查空值。这将引发溢出异常

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.