123

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

4

15 回答 15

257

在下面试试这个

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
于 2013-07-02T05:55:01.217 回答
52

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

于 2014-01-02T04:25:47.960 回答
11

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

当直接在 SSMS 中发布语句时,我使用的格式yyyymmdd似乎很通用。到目前为止,我在进行的各种安装中都没有遇到任何问题。

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

select { d '2013-10-01' }

将返回 2013 年 10 月的第一天。

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

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

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

于 2013-07-02T06:34:07.347 回答
5

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

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!
于 2013-07-02T05:58:55.423 回答
5

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

于 2020-07-13T15:49:11.840 回答
4

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

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 
于 2013-07-02T05:56:12.393 回答
3

如果您想将当前日期存储在表格中,以便您可以使用

获取日期();

或将此函数作为参数传递

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

于 2015-11-30T13:22:04.713 回答
1

我一直在寻找的答案是:

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 的新程序员来说,这相当令人困惑

于 2013-07-02T22:47:28.640 回答
1

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

SqlDateTime myDateTime = DateTime.Now;
于 2013-07-02T23:12:10.143 回答
1

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

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");
于 2015-08-04T05:38:47.727 回答
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 中为每个字符串使用单引号。我希望这有帮助。

于 2019-02-11T04:14:52.357 回答
-1

只有你把 "T"+DateTime.Now.ToLongTimeString()+ '2015-02-23'

于 2015-06-29T01:38:30.843 回答
-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());
于 2015-07-03T16:48:25.763 回答
-2

将 DateTime 从 C# 传递到 SQL Server 的另一种解决方案,而不考虑 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

于 2018-11-13T08:25:05.100 回答
-2
   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();
于 2019-11-19T09:36:50.297 回答