2015-12-08 2 views
3

У меня есть таблица в MS-SQL базы данных, которая содержит даты в колонке, как так:Проблемы преобразования строки в дату

2012-10-31 00:00:00.000 

Этот столбец указан как тип «DateTime». Как и в, в студиях управления сервером ms sql, я расширяю таблицу, затем столбцы и вижу Даты (PK, datetime, not null).

Затем в C# я получаю эти даты с инструкцией и назначаю ее переменной, которая заполняет столбец сетки на веб-странице, сделанной w/asp.net. Оператор sql просто получает последнюю запись пользователя.

 SqlCommand command = new SqlCommand(); 
     //connection info here 
     sql2 = "select max(day) as day from users u join days d on d.User_ID = u.id where u.ActiveUser = 1 and u.id = " + Users["ID"].ToString();; 
     command.CommandText = sql2; 
     dates["Entry"] = command.ExecuteScalar(); 

Это заполнит даты в колонке следующим образом:

10/31/2012 12:00:00 AM 

Теперь, я понятия не имею, почему она становится преобразованный так. Я выполнял данные во время отладки и менял ее с помощью функции command.ExecuteScalar(). Формат, который я хотел бы иметь:

10/31/2012 

без hh/mm/ss AM.

Я не мог заставить ANY DateTime конвертировать/разбор/форматирование работать правильно. Я провел четыре дня на этом. Я задал аналогичный вопрос здесь: Converting date to proper format, пробовал все разные предложения.

Что я делаю в то же время является:

string dt = command.ExecuteScalar().ToString(); 
dt = dt.Substring(0, dt.IndexOf(" ") + 1); 
dates["Entry"] = dt; 

Что избавляется от всего текста после пробела в строке даты, который был возвращен. Это было бы хорошо, за исключением того, что я хотел сравнить эти даты, которые я получаю, поэтому мне нужны они в DateTime. Попытка конвертировать эти строки в DateTime просто не сработает.

Edit: Определения и типы -

DataRow dates; 
//for loop here going through for each user 
dates = _dtuserhours.NewRow(); // _dtuserhours is a DataTable 
//Sql statements here 
_dtuserhours = new DataTable("newtable"); 
DataColumn column; 
column = new DataColumn(); 
column.DataType = System.Type.GetType("System.String"); 
column.ColumnName = "Entry"; 
_dtUserHours.Columns.Add(column); 
+3

Вы пытались использовать дату в качестве типа данных столбца вместо даты и времени? –

+0

Хорошее предложение, но я ничего не могу изменить в базе данных. Мне разрешено получать от него все, чтобы читать, но ничего не менять. – pfinferno

ответ

4

Во-первых, вам необходимо изменить SQL строку использовать параметры команды, в противном случае вы открыты для атаки SQL Injection.

Далее Вы можете сформировать вывод поля DateTime в SQL Server для вывода формата, который вы ищете. То, что вы получаете, это формат по умолчанию для DateTime в зависимости от вашей культуры.

Или, вы можете легко использовать только строку форматера свойство объекта DateTime, который возвращается, как это:

dates["Entry"] = ((DateTime)command.ExecuteScalar()).ToString("MM/dd/yyyy"); 

EDIT: Попробуйте вместо этого:

dynamic result = command.ExecuteScalar(); 
dates["Entry"] = result.ToString("MM/dd/yyyy"); 

EDIT в EDIT - установленный в динамический, потому что компилятор не знает, что возвращает ExecuteScalar во время компиляции.

+0

Я обязательно установлю параметры. Кто-то предложил свойство форматирования строк в моем другом вопросе раньше, но это ошибка, которую я получаю: «InvalidCastException был необработанным кодом пользователя. Указанный приведение недействительно». – pfinferno

+0

Каков тип данных столбца дня в базе данных? –

+0

Щелкните правой кнопкой мыши на нем и перейдите к свойствам, он говорит, что тип данных - это дата и время. В Нижнем регистре. – pfinferno

1

Вызов ToShortDateString на результат должен дать вам дату в нужном формате:

dates["Entry"] = ((DateTime)command.ExecuteScalar()).ToShortDateString() 

Для этого, чтобы работать, как ожидалось, вам нужно будет изменить тип данных для столбца dates["Entry"] в DateTime:

column.DataType = typeof(DateTime); 
+0

Та же проблема, что и ответ ниже, дающий InvalidCastException. – pfinferno

+0

@pfinferno Скорее всего, проблема связана с определением «даты». Пожалуйста, напишите, как определяются «даты». – HashPsi

+0

Я думаю, что вы и острый ниндзя. даты определяются как даты DataRow; – pfinferno

2

Если у вас возникли проблемы с получением .Net для преобразования даты в нужный формат, вы всегда можете преобразовать ее в форматированную строку в SQL.

См. http://www.techonthenet.com/sql_server/functions/convert.php для получения списка доступных форматов и способов их использования. В этом случае было бы что-то вроде

SELECT CONVERT(nvarchar, max(day), 101) AS day 
FROM users u JOIN days d ON d.User_ID = u.id 
WHERE {etc, and parameterise your query!} 
+0

Я пробовал это, используя значение «101» для mm/dd/yyyy, но не знал, как добавить это в мой SQL-запрос, или если мне нужно новое заявление полностью? (очень новый для sql) – pfinferno

+0

Отредактировано, чтобы показать синтаксис явно – eftpotrm

1

Так у вас есть две проблемы:

1) Показать столбец Дата время в определенном формате (т.е. MM/DD/YYYY)

2) Также используйте эту колонку для сравнения Datetime.

Вот два подхода:

A) Есть две колонки (не хороший способ решения вещей, но делается работа) в вашем DataTable.

i. Один столбец для отображения (который будет иметь строку типа данных, которую вы сделали выше).

ii. Другая колонка с типом данных DateTime для сравнения.

Б) Манипулирование одну DateTime Колонка

я. Из того, что я вижу, у Entry Date есть строка типа данных, измените ее на datetime &, заполните ее без преобразования строк через Executescalar.

ii. Везде, где вы показываете столбец EntryDate, выполните преобразование inplace, используя метод toString («MM/dd/yyyy»).

iii. Где бы вы ни сравнивались, просто добавьте его в Datetime &.

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