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

Ace*_*rya 94 c# sql datetime

我试图从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");
Run Code Online (Sandbox Code Playgroud)

日期输出没问题,但时间总是"12:00:00",所以我将代码更改为以下内容:

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

它给了我这个编译错误:

FormatException未处理

并建议我需要解析.所以我根据我在StackOverflow中的研究尝试对我的代码执行此操作:

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

要么

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

但它告诉我,这是一种对给定的上下文无效的方法.我试着寻找解决问题的方法,现在我被困了两个小时.我在C#中还是有点新鲜,你能帮帮我吗?

Deb*_*yay 192

试试这个

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

  • 使用 myDateTime.ToString("o");` 代替,它比这个答案更精确,并且在文档中字面描述为“往返日期/时间模式”。请参阅:https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings (4认同)
  • 是的,在官方页面 [CAST 和 CONVERT (Transact-SQL)](https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql) 上,他们使用名称“ODBC canonical”表示形式,并用空格将“yyyy-MM-dd”与一天中的时间分隔开,并使用名称“ISO8601”表示分隔字符为“T”的形式。但是,是的,这两种形式都隐式(并且正确)转换为“日期时间”。 (2认同)

InA*_*ive 42

Using the standard datetime format "s" will also ensure internationalization compatibility (MM/dd versus dd/MM):

myDateTime.ToString("s");

=> 2013-12-31T00:00:00
Run Code Online (Sandbox Code Playgroud)

Complete Options: (code: sample result)

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
Run Code Online (Sandbox Code Playgroud)

Supported in .NET Framework: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
Reference: DateTime.ToString Method

  • 这不够细粒度(错过了毫秒)并且会让您在依赖于按日期排序的查询中遇到麻烦。 (2认同)
  • 使用 myDateTime.ToString("o");` 代替,它有毫秒,并且在文档中字面描述为“往返日期/时间模式”。“s”仅被描述为“可排序的日期/时间模式”,所以我不建议使用它。请参阅:https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings (2认同)

mkb*_*mkb 13

让我们使用内置的 SqlDateTime 类

new SqlDateTime(DateTime.Now).ToSqlString()
Run Code Online (Sandbox Code Playgroud)

但仍然需要检查空值。这会抛出溢出异常

new SqlDateTime(DateTime.MinValue).ToSqlString()
Run Code Online (Sandbox Code Playgroud)

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


alz*_*mar 8

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

在SSMS中直接发布语句时,我使用的格式yyyymmdd看起来很一般.到目前为止,我没有遇到任何问题.

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

select { d '2013-10-01' }
Run Code Online (Sandbox Code Playgroud)

将于2013年10月1日返回.

select { ts '2013-10-01 13:45:01' }
Run Code Online (Sandbox Code Playgroud)

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

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


Dmi*_*nko 5

您的问题出在DateTime仅截断为日期的“日期”属性中。你可以像这样进行转换:

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