【问题标题】:DateTime format to SQL format using C#使用 C# 将 DateTime 格式转换为 SQL 格式
【发布时间】:2013-06-29 09:18:44
【问题描述】:

我正在尝试从 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 吗?
  • 为什么不使用参数来更新DateTime 或者将其存储为字符串? Date 上的 ToString 也意味着时间总是 12:00:00
  • 您应该使用带有DATETIME 类型参数的参数化查询,这样您就可以避免在字符串表示之间来回转换!跨度>
  • 正如其他人所说,使用参数并将所有内容保留为datetime 将是一个好的开始。更好的是,你为什么要传递服务器 current 时间 - 它有一个 GETDATE() 函数,可以完全在服务器端调用。

标签: c# sql datetime


【解决方案1】:

在下面试试这个

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

【讨论】:

  • 非常感谢我正在尝试字符串 sqlFormattedDate = myDateTime.DateTime... 出于某种原因,这就是我想要实现的目标。
  • 我在 stackoverflow 中的搜索一直将我引向一个错误的参考,尽管这个问题已经被回答了好几次,像我这样的新手因此无法联系起来。对不起,我会尽快结束这个问题。
  • 我认为 C#“Sortable”格式做同样的事情。所以你可以做 myDateTime.ToString("s");
  • @ProVega 它看起来不一样(.ToString('s') 有一个 T 而不是日期和时间之间的空格) - 但我可以确认它们的解析相同带或不带 T 的 SQL 服务器(我在 2012 年)。我已经开始使用 's' 作为我的日志记录日期时间格式,所以我会继续使用,谢谢!
  • 是的,在官方页面CAST and CONVERT (Transact-SQL) 上,他们使用名称“ODBC canonical”作为表单,yyyy-MM-dd 与一天中的时间用空格分隔,名称“ISO8601”用于分隔符为T 的形式。但是,是的,这两种形式都隐式(并且正确地)转换为datetime
【解决方案2】:

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

【讨论】:

  • 这不够细粒度(错过毫秒),并且会在依赖于按日期排序的查询中给您带来麻烦。
  • 要获得小时和分钟,您可以使用以下转换: string sqlFormattedDate = YourDate.ToString("yyyy-MM-ddTHH:mm:ss", System.Globalization.CultureInfo.不变文化);
  • 改用myDateTime.ToString("o");,它有毫秒,在文档中被字面描述为“往返日期/时间模式”。 "s" 仅被描述为“可排序的日期/时间模式”,所以我不建议为此使用它。见:docs.microsoft.com/en-us/dotnet/standard/base-types/…
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您的问题出在“日期”属性中,该属性仅将DateTime 截断至今。 你可以这样转换:

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

    【讨论】:

      【解决方案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.

      【讨论】:

        【解决方案6】:

        您的第一个代码将通过这样做来工作

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

        【讨论】:

          【解决方案7】:

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

          GETDATE();

          或将此函数作为参数

          传递

          例如。 'update tblname set curdate=GETDATE() where colname=123'

          【讨论】:

          • 它作为 SQL 表的默认值效果更好。除非您使用的框架不允许使用默认值。
          【解决方案8】:

          我正在寻找的答案是:

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

          【讨论】:

            【解决方案9】:

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

            SqlDateTime myDateTime = DateTime.Now;
            

            【讨论】:

              【解决方案10】:

              您的问题出在Date 属性中,该属性仅将DateTime 截断至今。您可以这样进行转换:

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

              【讨论】:

              • 谢谢。正是我要找的东西 ;) 很惊讶微软没有添加标志或命令来更简短地执行此操作。
              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                • 第一个日期 XD date + "T" + DateTime.Now.ToLongTimeString()
                【解决方案13】:

                如果你想用那个 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());
                

                【讨论】:

                • 这个问题已经通过更优雅的解决方案得到了回答和接受。你错过了一个结束"
                【解决方案14】:
                   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();
                

                【讨论】:

                  【解决方案15】:

                  另一种将 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

                  【讨论】:

                  • 这只会在 DateTime 上调用 ToString(),这是特定于文化设置的。如果发送此 SQL 命令的机器使用 SQL 服务器以外的其他文化设置,则 SQL 服务器可能会将其误认为是其他内容。不要这样做!见:docs.microsoft.com/en-us/dotnet/api/…
                  猜你喜欢
                  • 2023-04-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-17
                  • 1970-01-01
                  • 2022-11-05
                  • 1970-01-01
                  • 2016-09-08
                  相关资源
                  最近更新 更多