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


111

我正在尝试从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#还是有点陌生​​,可以帮我吗?


您是否看过DateTime.TryParseExact?
蒂姆(Tim)


3
为什么不使用参数来更新DateTime或将其存储为字符串?还ToStringDate将意味着时间永远是12:00:00
V4Vendetta

3
您应该使用参数类型为参数的查询DATETIME然后可以避免在字符串表示形式之间来回转换!
marc_s

5
就像其他人所说的那样,使用参数并将所有内容保持原样datetime是一个好的开始。更好的是,为什么要在当前时间传递服务器-它具有GETDATE()可以在服务器端完全调用的功能。
Damien_The_Unbeliever

Answers:


219

在下面试试

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

非常感谢您我尝试使用字符串sqlFormattedDate = myDateTime.DateTime ...由于某种原因,这就是我想要实现的目标。
Ace Caserya

尽管这个问题已经被回答了好几次,但是我在stackoverflow中的搜索一直在向我提供错误的参考,因此像我这样的新手无法联系。对不起,我将尽快解决问题。
Ace Caserya

1
我认为C#“ Sortable”格式也做同样的事情。因此,您可以只做myDateTime.ToString(“ s”);
ProVega 2014年

@ProVega看起来不一样(.ToString('s)有T而不是日期和时间之间的空格)-但我可以确认SQL Server是否使用T解析了它们(我在2012年)。我已经开始使用's'作为我的日志记录日期时间格式,所以我同意,谢谢!
伊恩·格兰杰

是的,在CAST和CONVERT(Transact-SQL)官方页面上,他们将名称“ ODBC canonical”用于表单yyyy-MM-dd,并与一天中的时间分隔,并使用名称“ ISO8601”用于其中分隔符为一个T。但是是的,两种形式都隐式(正确地)转换为datetime
杰普·斯蒂格·尼尔森

44

使用标准日期时间格式“ 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方法


1
这不够细致(错过了毫秒),将使您在依赖按日期排序的查询中遇到麻烦。
reijerh

要获得小时和分钟,也可以使用以下转换:字符串sqlFormattedDate = YourDate.ToString(“ yyyy-MM-ddTHH:mm:ss”,System.Globalization.CultureInfo.InvariantCulture);
netfed

9

正确答案已经给出“使用参数”。格式化日期并将其作为字符串传递给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注入和奇怪错误的条目(格式化浮点值是另一个潜在的问题)


3

通过执行此操作,您的第一个代码将起作用

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

3

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

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

2

我一直在寻找答案:

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

我还了解到您可以通过以下方式做到这一点:

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

其中myCountryDateFormat可以根据要求进行更改以满足更改。

请注意,带有标签的“此问题可能已经在这里有了答案:”实际上并没有回答该问题,因为如您所见,它使用的是“ .Date”而不是忽略它。对于.NET的新程序员来说,这非常令人困惑


2

如果要将当前日期存储在表中以便使用

GETDATE();

或将此函数作为参数传递

例如。'更新tblname设置curdate = GETDATE()其中colname = 123'


1

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

SqlDateTime myDateTime = DateTime.Now;

1

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

DateTime myDateTime = DateTime.Now;

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

谢谢。正是我想要的;)感到惊讶的是,Microsoft并未添加标志或命令来更简短地执行此操作。
Zeek2

0

不管SQL Server语言设置如何,将DateTime从C#传递到SQL Server的另一种解决方案

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

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

将C#datetime变量传递给SQL Server Date类型变量,并考虑按照“ 104”规则进行映射。SQL Server日期获取yyyy-MM-dd

如果您的区域设置以不同的方式显示DateTime,则使用SQL Server CONVERT表中的适当匹配项

查看有关规则的更多信息:https : //www.techonthenet.com/sql_server/functions/convert.php


0

我认为问题是缺少两个单引号。

这是我运行到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中,对每个字符串都使用单引号。我希望这有帮助。


0

让我们使用内置的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.



-1

如果要使用该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());

2
这个问题已经通过更优雅的解决方案得到了回答和接受。而且您错过了结帐"
1

-1
   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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.