русский
Germany.ruForen → Архив Досок→ Programmierung

Как правильно даты сравнивать в MSSQL?

87  
voxel3d Убить всех транслитчиков!18.12.06 12:49
voxel3d
NEW 18.12.06 12:49 
Zuletzt geändert 18.12.06 12:50 (voxel3d)
В таблице поле DateTime FIELD, я имею DateTime значение, надо выбрать все записи где FIELD > значения. Что к чему приводить надо? Методом тыка нашёл следущее:
SELECT * FROM Table WHERE FIELD > var_1,
в программе:
var_1 = год + "." + число + "." + месяц.
Прямее есть способ? Может какие-то функции форматирования дат в самом MSSQL, чтобы туда DateTime можно передавать было?
Dropbox - средство синхронизации и бэкапа файлов.
#1 
  scorpi_ nobody18.12.06 13:12
NEW 18.12.06 13:12 
in Antwort voxel3d 18.12.06 12:49
Ты б ещё сказал, с какой библиотекой ты работаешь.
#2 
Murr коренной житель18.12.06 13:25
Murr
NEW 18.12.06 13:25 
in Antwort voxel3d 18.12.06 12:49

SELECT * FROM Table WHERE FIELD > @v_var_1,
>Прямее есть способ?
В QA жать "F1", печатать 'date', читать.
по ситуации - CAST и CONVERT, возможно DATEADD, DATEFORMAT
А вообще - это не то место, где надо манипулировать датой - отдай ее как параметр процедуре, а вычисляй - в бизнес-объекте.
P.S. Хардкоденную точку - выкидывай сразу - на каждом серваке все по-другому...

#3 
Murr коренной житель18.12.06 13:27
Murr
NEW 18.12.06 13:27 
in Antwort scorpi_ 18.12.06 13:12
Там без разницы - процедурный SQL практически не изменяется...
#4 
  scorpi_ nobody18.12.06 13:28
NEW 18.12.06 13:28 
in Antwort Murr 18.12.06 13:25
Он не об этом спрашивает.
#5 
Murr коренной житель18.12.06 13:36
Murr
NEW 18.12.06 13:36 
in Antwort scorpi_ 18.12.06 13:28
Поглядим по уточнении...
#6 
  scorpi_ nobody18.12.06 13:38
NEW 18.12.06 13:38 
in Antwort Murr 18.12.06 13:36
Насколько я понял, он спрашивает, как DateTime передать в параметр.
#7 
voxel3d Убить всех транслитчиков!18.12.06 13:50
voxel3d
NEW 18.12.06 13:50 
in Antwort scorpi_ 18.12.06 13:38
> Насколько я понял, он спрашивает, как DateTime передать в параметр.
Угу. Вот, наш╦л:
SELECT * FROM tblFehlzeit
WHERE convert(varchar(10), Beginn, 112) >= '20061230'
параметр из DateTime переделываю в строку ('20061230'). Хотелось бы вот такую строку передавать: '30.12.2006 00:00:00'. Работаю с C# .Net System.Data.SqlClient.
Dropbox - средство синхронизации и бэкапа файлов.
#8 
Murr коренной житель18.12.06 13:54
Murr
NEW 18.12.06 13:54 
in Antwort scorpi_ 18.12.06 13:38
DateTime передается (у него .Net сейчас) элементарно:
В ответ на:

internal IDbDataParameter AddParameter(IDbCommand cmd, string paramName,
DbType dbType, object value)
{
IDbDataParameter parameter = cmd.CreateParameter();
parameter.ParameterName = CreateCollectionParameterName(paramName);
parameter.DbType = dbType;
if (null == value)
{
parameter.Value = DBNull.Value;
}
else if (dbType == DbType.Boolean)
{
string val = (string)value;
if ((val == "Yes") || (val == "True"))
parameter.Value = bool.TrueString;
else if( (val == "No") || (val == "False"))
parameter.Value = bool.FalseString;
else
parameter.Value = DBNull.Value;
}
else
{
parameter.Value = (string)value;
}

cmd.Parameters.Add(parameter);
return parameter;
}

Вроде это покрывает все, кроме Блобов...
#9 
Murr коренной житель18.12.06 14:01
Murr
NEW 18.12.06 14:01 
in Antwort voxel3d 18.12.06 13:50
В ответ на:

> Насколько я понял, он спрашивает, как DateTime передать в параметр.
Угу. Вот, нашёл:
SELECT * FROM tblFehlzeit
WHERE convert(varchar(10), Beginn, 112) >= '20061230'

А зачем? Конечная цель? Отобрать записи, после указанной даты?
DATEDIFF(поле, @парам) > 0
Где поле и @парам - datetime типа
В ответ на:

параметр из DateTime переделываю в строку ('20061230'). Хотелось бы вот такую строку передавать: '30.12.2006 00:00:00'.

Это и будетю И без всяких заморочек с форматом даты.
#10 
Murr коренной житель18.12.06 14:04
Murr
18.12.06 14:04 
in Antwort Murr 18.12.06 13:54
Да, забыл... для datetime типа тип параметра - DbType.DateTime. Все.
#11 
  digital.pilot свой человек18.12.06 14:08
digital.pilot
NEW 18.12.06 14:08 
in Antwort voxel3d 18.12.06 13:50, Zuletzt geändert 18.12.06 14:11 (digital.pilot)

yyyymmdd hh:mm:ss - самый бронебойный формат, гарантирует отсутствие проблем при любых региональных настройках. Если передавать строкой, то только так. Остальное сакс и чревато граблями.
datetime конвертить в nvarchar не надо. datetime-поле можно напрямую со строкой сравнивать, в которой дата содержится.
#12