Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Как в MSSQL в SQL работать с датами 


ol   (2002-02-07 16:05) [0]

Писал под ORACLE, никогда не возникало проблем с датами
Подскажите, в базе дата формата 01.01.01, делаю запрос
select w,e,r
from dfdfd
where data between "01.01.02" and "29.01.02"
Выдает данные и за 2001 год и за 02 месяц этого года,
может эту дату как-то конвертить нужно?



handra   (2002-02-07 16:42) [1]

Касательно 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)



ol   (2002-02-07 17:12) [2]

>where data between CONVERT(char(10),"01.01.02",104) and CONVERT
>(char(10),"29.01.02",104)
результат не изменился есть и второй месяц и 2001 год
я извратился но это через одно место
пооддельности сравниваю день,месяц,год но работает в два раза дольше



wicked   (2002-02-07 17:18) [3]

2 ol
поле data какого типа?..... если типа datetime, тогда надо писать convert( DATETIME, "29.01.2002", 104).... или convert( DATETIME, "29.01.02", 4)... обрати внимание на форматы даты и число (4 или 104)... если год - 2 разряда, то надо использовать 4, если в году 4 разряда, то 104....



wicked   (2002-02-07 17:22) [4]

кстати, по моим личным наблюдениям (специально не проверял), запись даты в виде строки "yyyy-mm-dd" работает только из под mssql"евского query analyzer"а.... во всех остальных случаях надо писать convert(...)



wicked   (2002-02-07 17:23) [5]

кстати, по моим личным наблюдениям (специально не проверял), запись даты в виде строки "yyyy-mm-dd" работает только из под mssql"евского query analyzer"а.... во всех остальных случаях надо писать convert(...)



ol   (2002-02-07 17:26) [6]

>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:32) [7]

2 ol

напиши свой запрос....



ol   (2002-02-07 17:39) [8]

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:46) [9]

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:50) [10]

сорри
но и при "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:57) [11]

2 ol

ну твой способ имеет недостаточек - трудно отлавливаемые ошибки.... а насчёт convert"а - глянь в transact sql help.... там всё классно расписано....



Fay   (2002-02-08 02:36) [12]

where data between "2002.01.01 00.00.00.000" and
"2002.01.29 00.00.00.000"



kserg@ukr.net   (2002-02-08 10:48) [13]

По сути вопроса хочу поделиться с народом своими наблюдениями.
(Кстати он обсуждался здесь пару месяцев назад).
Я тоже сталкнулся с этой проблемой - не мог понять, вроде в виндах в региональных установках стоит формат 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;


Всё работает - и теперь у меня нет проблем с датами.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.067 c
7-19368           sedoy                 2001-11-29 18:16  2002.03.07  
одинаковые номера HDD


14-19340          alexproger            2002-01-19 18:32  2002.03.07  
Где найти программу


14-19310          Свой                  2002-01-17 23:30  2002.03.07  
icq i его ip


4-19398           Павел2                2002-01-08 19:29  2002.03.07  
Что шлет программе TaskManager при нажатии SwitchTo?


14-19329          ses                   2002-01-18 18:48  2002.03.07  
Как можно???????????