【问题标题】:Which SQL Date format哪种 SQL 日期格式
【发布时间】:2015-08-16 02:10:18
【问题描述】:

T-SQL 使用哪种日期格式?它依赖于系统日期吗?无论系统日期格式如何,如何确保我的参数正确传递。这个问题是因为错误:

将数据类型 nvarchar 转换为日期时间时出错。

部分 SQL 脚本:

CREATE PROCEDURE [dbo].[sz_pipeline04_pipelUpdte_inventory] 
-- Add the parameters for the stored procedure here
@myFixDte datetime,
@doInsert bit   
AS   
BEGIN

调用c#代码:

    public static DataTable GridInventory(string strdProcedureName, DateTime fixDate, bool execInsertYN)
    {
        DataTable dtbl_inventory = null;
        try
        {
            dtbl_inventory = new DataTable();

            using (var conn = new SqlConnection(cls_connRegistry.GetConnStrFull()))
            using (var command = new SqlCommand(strdProcedureName, conn)
            {
                CommandType = CommandType.StoredProcedure
            })
            {

                command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = DateTime.Parse(fixDate.ToShortDateString());
                command.Parameters.Add("@doInsert", SqlDbType.Bit).Value = execInsertYN;

                conn.Open();
                SqlDataReader dr = command.ExecuteReader();
                dtbl_inventory.Load(dr);
                conn.Close();
            }
        }
        catch (Exception datawalile)
        { dtbl_inventory = null; }

        return dtbl_inventory;
    }

已编辑问题。

【问题讨论】:

  • Here关于将varchar转换为数据类型的链接
  • @N.Molderf 谢谢。但是,这里的问题不是关于 SQL 中的日期格式,而是关于我如何知道/获取在 SQL 中使用的当前日期 FORMAT,或者一个可以在任何时候使用任何 SQL 日期格式的函数。所以我在我的 c# 应用程序中发送参数,并且 GUI 日期控件根据系统日期格式更改日期格式 - 很好:我原以为 SQL 遵循相同的逻辑,但显然不是 - 我如何传递这些参数。
  • 理想情况下,如果您从其他语言访问 SQL,请使用 parameters 将数据作为 DateTime 值传递,让语言绑定/数据访问库处理转换为 SQL Server 的 datetime 类型,并避免将其作为 string 传递。仅当您将值作为 string 而不是适当的类型传递时,才会出现格式问题。
  • @Damien_The_Unbeliever:好吧,我来回尝试过(日期或字符串参数),但失败了。这是我的脚本:
  • 如果您想显示更多代码,请edit您的问题。

标签: c# sql sql-server tsql datetime


【解决方案1】:

这不是有效的 DATETIME 格式DD-MM-YYYY

您可以使用CONVERT它在以下:

DECLARE @myFixDte DATETIME
SET @myFixDte = CONVERT(DATE, N'30-12-2012', 104)
SELECT @myFixDte 

或者您可以设置它而不转换为其他格式,例如YYYY-MM-DD

【讨论】:

  • 勾选答案左上角的“V”。
【解决方案2】:

试试这个:

@myFixDte = convert(datetime, '30-12-2012', 105) 

并检查@N.Molderf 提供的链接

【讨论】:

  • 见上文。我认为格式不仅是日月年的顺序,还有分隔符(“-”或“.”或“/”):我怎么知道哪个在使用?
【解决方案3】:

SQL Server 始终以相同的方式识别一种格式,无论它使用哪种文化,并且该格式为 YYYYMMDD

因此,您始终可以使用2012020220151225 格式的日期,SQL Server 将使用相同的掩码解析该参数。

【讨论】:

  • 你是对的 - 我当时不知道,但经过大量谷歌搜索和 SQL 文档后我意识到。
【解决方案4】:

为什么你没有像上面那样告诉 c# datetime,这里有一个简单的例子告诉你如何在你的情况下解决这个问题,它会是这样的

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

还是这个

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

第二个是默认的

【讨论】:

  • 这假设我将一个字符串参数传递给 sql。我正在传递日期时间格式。哪个最好?
  • 在你的情况下,你不知道你在 sql 端的日期时间,所以这个解决方案对你来说会更好,试试它是如何工作的
  • @Chagbert 日期是否可能超出该范围?它来自用户输入吗?如果其中任何一个问题的答案是肯定的,那么您应该始终检查 - 否则您的应用程序容易出错。
  • 感谢 Molderf - 这个建议让我最终使用了我立即在 SQL 过程中转换的字符串参数 - 请参阅@Stanislovas Kalašnikovas 的答案
  • @Chagbert - 不幸的是,这不是正确的解决方案。在处理日期时,您应该始终使用 date[time] SQL 参数 - 使您的过程独立于当前文化或任何日期格式(除非您的数据库包含日期作为字符串,这完全是另一个问题)。并且 - SQL 日期格式不是 yyyymmdd 类型的 - SQL 日期格式是日期的某种二进制表示,取决于所使用的确切格式。
【解决方案5】:

您现在发布的代码看起来是正确的 - 除了一件事:

command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = DateTime.Parse(fixDate.ToShortDateString());

正如我在 cmets 中所说,只有在转换为字符串时才会出现格式问题。所以就这样做吧:

command.Parameters.Add("@myFixDte", SqlDbType.DateTime).Value = fixDate;

DateTimes (C#) 和 datetime (T-SQL) 没有格式。将它们转换为字符串时会出现格式问题。在它们的原生表示中,它们通常只是自过去某个固定点以来的许多事件(滴答声、毫秒等)的计数。 ADO.Net 知道如何将 DateTime 转换为 SQL Server datetime

如果您还有其他转换问题,则可能是您尚未显示的代码。但这又是因为您正在转换正确的数据类型 (datetime) 并使用字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2013-01-21
    相关资源
    最近更新 更多