![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в MSSQL в SQL работать с датами [D6, MSSQL, Oracle]
ol © (2002-02-07 16:05:00)Писал под ORACLE, никогда не возникало проблем с датами
Подскажите, в базе дата формата 01.01.01, делаю запрос
select w,e,r
from dfdfd
where data between "01.01.02" and "29.01.02"
Выдает данные и за 2001 год и за 02 месяц этого года,
может эту дату как-то конвертить нужно?
kserg@ukr.net (2002-02-08 10:48:00) [1]По сути вопроса хочу поделиться с народом своими наблюдениями.
(Кстати он обсуждался здесь пару месяцев назад).
Я тоже сталкнулся с этой проблемой - не мог понять, вроде в виндах в региональных установках стоит формат ddmmyy, а MSSQL -
- кроет меня матом.
Оказалось, что MSSQL начхать на виндовские установки и его формат даты по умолчанию - mmddyy.
А я упорно пытался вставить ddmmyy...
Решение проблемы -
или использовать парметрические запросы, где
этот конфликт улаживается сам собой,
или сметить этой самый DEFAULT на нужный
По этому поводу ниже привожу выдержку из форума
------------------------------------------------
Cуществует системная таблица master.dbo.syslanguages
в которой хранятся региональные установки, как-то:
формат даты, список названий месяцев, дни недели и т.п.
Информацию об этом можно получить командой
exec sp_helplanguage
или exec sp_helplanguage "русский" - для русского яз. соответственно.
Для установки конкретному логину своих региональные установок используется следующее: exec sp_defaultlanguage "sa", "русский"
Если надо установить региональные установки для всего сервера
то делать надо так:
exec sp_configure "default language", 21
где 21 - langid из syslanguages,
однако последняя операция, довольно опасна и делается,
как правило, автоматически и один раз - при инсталяции MSSQL.
--------------------------------------------------
Далее, к сожалению мне так и не удалось реализовать
через смену установки даты конкретному логину.
(народ, кто может - проверьте ещё раз, может выйдет?)
Поэтому я поступил след.образом:
так сказать "метод в лоб" -
на TADOConnection на событие AfterConnect выполняю:
quTemp1.SQL.Clear;
quTemp1.SQL.Add("SET DATEFORMAT dmy");
quTemp1.ExecSQL;
quTemp1.close;
Всё работает - и теперь у меня нет проблем с датами.
Fay (2002-02-08 02:36:00) [2]where data between "2002.01.01 00.00.00.000" and
"2002.01.29 00.00.00.000"
wicked (2002-02-07 17:57:00) [3]2 ol
ну твой способ имеет недостаточек - трудно отлавливаемые ошибки.... а насчёт convert"а - глянь в transact sql help.... там всё классно расписано....
ol (2002-02-07 17:50:00) [4]сорри
но и при "4" ничего не отгребло
я сделал так
(datepart (yy,w.dat_tek) between datepart (yy,"01.01.02") and datepart (yy,"20.01.02")) and
(datepart (mm,w.dat_tek) between datepart (mm,"01.01.02") and datepart (mm,"20.01.02")) and
(datepart (dd,w.dat_tek) between datepart (dd,"01.01.02") and datepart (dd,"20.01.02"))
wicked (2002-02-07 17:46:00) [5]2 ol
ну, я ж написал- "если год - 2 разряда(29.01. 02), то надо использовать 4- convert(datetime, "29.01.02", 4), если в году 4 разряда (29.01. 2002), то 104- convert(datetime, "29.01.2002", 104)"....
ol (2002-02-07 17:39:00) [6]select w.ev_day,q.subdivid,q.family,q.name,q.Patronymic,w.ev_time ,
w.dat_tek,w.TKD_MAKEADR,w.EV_DAY
from userinf q, events w
where q.cardid=w.ev_cardid
and q.family="Пустовойт" and q.name="Олег" and
w.dat_tek between CONVERT(DATETIME,"01.01.02",104) and CONVERT(DATETIME,"29.01.02",104)
wicked (2002-02-07 17:32:00) [7]2 ol
напиши свой запрос....
ol (2002-02-07 17:26:00) [8]>convert(DATETIME, "29.01.02", 4)... обрати внимание на форматы
>даты и число (4 или 104)... если год - 2 разряда, то надо
>использовать 4, если в году 4 разряда, то 104....
Server: Msg 241, Level 16, State 1, Line 1
Syntax error converting datetime from character string.
:-(((
wicked (2002-02-07 17:23:00) [9]кстати, по моим личным наблюдениям (специально не проверял), запись даты в виде строки "yyyy-mm-dd" работает только из под mssql"евского query analyzer"а.... во всех остальных случаях надо писать convert(...)
wicked (2002-02-07 17:22:00) [10]кстати, по моим личным наблюдениям (специально не проверял), запись даты в виде строки "yyyy-mm-dd" работает только из под mssql"евского query analyzer"а.... во всех остальных случаях надо писать convert(...)
wicked (2002-02-07 17:18:00) [11]2 ol
поле data какого типа?..... если типа datetime, тогда надо писать convert( DATETIME, "29.01.2002", 104).... или convert( DATETIME, "29.01.02", 4)... обрати внимание на форматы даты и число (4 или 104)... если год - 2 разряда, то надо использовать 4, если в году 4 разряда, то 104....
ol (2002-02-07 17:12:00) [12]>where data between CONVERT(char(10),"01.01.02",104) and CONVERT
>(char(10),"29.01.02",104)
результат не изменился есть и второй месяц и 2001 год
я извратился но это через одно место
пооддельности сравниваю день,месяц,год но работает в два раза дольше
handra (2002-02-07 16:42:00) [13]Касательно MSSQL, есть 2 варианта:
1. Писать дату в стандартном формате (по умолчанию):
"2002-01-30" - 30 января 2002 года, т.е. ГГГГ-ММ-ДД
2. Использовать ф-ю CONVERT с указанием привязки формата даты:
select CONVERT(char(10),getdate(),104), CONVERT(datetime,"07.02.2002",104)
здесь используются локальная страница 104, что соответствует формату ДД.ММ.ГГГГ, т.е. в твоем случае:
select w,e,r
from dfdfd
where data between CONVERT(char(10),"01.01.02",104) and CONVERT(char(10),"29.01.02",104)