2015-06-02 73 views
0

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

Error converting data type nvarchar to datetime.

的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; 
    } 

编辑的问题。

+2

[这里](https://msdn.microsoft.com/ru-ru/library/ms187928.aspx)关于将varchar转换为数据类型的链接 –

+0

@ N.Molderf谢谢。然而,这里的问题不是关于SQL中的日期格式,而是我如何知道/获得当前使用SQL的日期格式,或者使用任何SQL日期格式的每一个工作时间的ONE函数。所以我在我的c#应用程序中发送参数,而GUI日期控件按照系统日期格式更改日期格式 - 很好:我会认为SQL遵循相同的逻辑,但显然不是 - 我如何传递这些参数。 – Chagbert

+2

理想情况下,如果您从另一种语言访问SQL,请使用*参数*作为DateTime值传递数据,让语言绑定/数据访问库处理SQL Server的'datetime'类型的转换并避免传递它作为*字符串*在所有。格式问题仅在将值作为*字符串*而非适当类型传递时才会出现。 –

回答

-1

你为什么没有告诉如上C#日期时间,这里是你一个简单的例子,如何解决你的情况下,这个问题会是这样的

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"); 

第二个是默认的

+0

这个假设我会将一个字符串参数传递给sql。我正在传递日期时间格式。哪个最好? – Chagbert

+0

在你的情况下,你不知道你在SQL端的日期时间,所以这个解决方案会对你更好,只是尝试它是如何工作的 –

+0

@Chagbert日期实际上可能超出该范围吗?它来自用户输入吗?如果对这些问题中的任何一个的答案都是肯定的,那么你应该经常检查 - 否则你会让应用程序容易出错。 –

0

这是无效的DATETIME格式DD-MM-YYYY

您可以使用CONVERT它在以下几点:

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

或者,你可以设置它没有在其他格式的转换像YYYY-MM-DD

+0

如何将此标记为最佳答案?谢谢 – Chagbert

+0

检查答案左上方的“V”。 –

0

试试这个:

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

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

+0

见上文。我认为格式不仅是日,月和年的顺序,还有分隔符(“ - ”或“。”或“/”):我怎么知道哪个在使用? – Chagbert

0

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

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

+0

你是对的 - 我当时并不知道,但是在我实现了很多谷歌和SQL文档之后。 – Chagbert

1

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

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

正如我在评论中所说的,问题只出现在转换为字符串时的格式化。所以只是做:

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

DateTime秒(C#)和datetime(T-SQL)不的格式。将格式转换为字符串时会出现格式问题。在它们的本地表示中,它们通常只是从过去的某个固定点开始的许多事件(蜱,毫秒等)的计数。 ADO.Net知道如何将DateTime转换为SQL Server datetime

如果您仍然存在转换问题,则代码中尚未显示。但它会再一次成为因为你正在转换正确的数据类型(datetime)并使用字符串。