2015-06-02 5 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, а о том, как я знаю/получаю текущую дату FORMAT, используемую в SQL, или альтернативную функцию ONE, которая будет работать КАЖДОЕ ВРЕМЯ с любым форматом даты SQL. Поэтому я отправляю аргументы в моем приложении C#, а формат даты изменения даты GUI изменяется в соответствии с системным форматом даты - отлично: я бы подумал, что SQL следует той же логике, но, по-видимому, нет - как передать эти аргументы независимо. – Chagbert

+2

В идеале, если вы обращаетесь к SQL с другого языка, используйте * parameters * для передачи данных в качестве значения DateTime, позвольте языковой привязке/библиотеке доступа к данным иметь дело с переводом на SQL-тип 'datetime' и избегать передачи это как * строка * вообще. Проблемы с форматированием возникают только тогда, когда вы передаете значение в виде строки *, а не соответствующего типа. –

ответ

-1

Почему вы не сказали, как описано выше в 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"); 

второй по умолчанию

+0

это предполагает, что я передам строковый параметр на sql. Я передаю формат даты и времени. Что лучше? – Chagbert

+0

в вашем случае вы не знаете, что вы datetime на стороне 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.

Поэтому вы всегда можете использовать свои даты в формате 20120202 или 20151225, а SQL Server проанализирует этот параметр, используя ту же маску.

+0

вы правы - я не знал, но после того, как я понял много документации по Google и Google. – 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) и используете строки.

Смежные вопросы