Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
3562Ребята, у меня вопрос:
Собственно, в VB есть функция, которая по передаваемым целочисленным аргументам формирует дату во внутреннее представление ОС. И разработчику не надо утруждать себя заморочками о региональных настройках.
Эта функция DateSerial(YYYY,MM,DD). Независимо от ОС и региональных настроек на выходе всегда дата с нулевыми параметрами времени (полночь).
Почему в SQL Server реализовано так, что бы сделать выборку по дате, надо использовать чаще всего символьную константу определенного формата - 'YYYYMMDD'? Почему 'YYYYMMDD' - интерпретируется как дата, то есть, формируя предикат по полю с типом DATE, мы указываем критерий сравнения символьную константу 'YYYYMMDD' и все выбирается?
25 апр 13, 17:18    [14231525]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
set dateformat :)
25 апр 13, 17:19    [14231531]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Простоинтересующийся,

для типа DATE ещё и 'YYYY-MM-DD'

На вопрос "почему?" можно ответить только, что есть стандарты
и так запрограммирован сервер фирмой Microsoft
25 апр 13, 17:21    [14231544]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Glory
Member

Откуда:
Сообщений: 104760
Простоинтересующийся
Почему в SQL Server реализовано так, что бы сделать выборку по дате, надо использовать чаще всего символьную константу определенного формата - 'YYYYMMDD'?

А вы часто прописываете константы в запросах ?

Простоинтересующийся
Почему 'YYYYMMDD' - интерпретируется как дата, то есть, формируя предикат по полю с типом DATE, мы указываем критерий сравнения символьную константу 'YYYYMMDD' и все выбирается?

Потому что такой формат признан международным стандартом ?
25 апр 13, 17:23    [14231557]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Maxx
set dateformat :)

Да, то есть изменив этот параметр, у нас не будут выполняться запросы, которые рассчитаные на другой формат?
Получается, что стандарт неудобный.
Например, в другом продукте microsoft, движке JET. Передаваемые движку символьные инструкции более логичные, например при выборке по дате, надо всегда передавать дату не как символьную константу, а как последовательность МЕСЯЦ, ДЕНЬ, ГОД, разделенных "/" и обрамленных решетками. (Американский формат даты - fdldate=#12/31/2013#). Что как-то более логично :)
25 апр 13, 17:28    [14231581]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Glory
Member

Откуда:
Сообщений: 104760
Простоинтересующийся
Да, то есть изменив этот параметр, у нас не будут выполняться запросы, которые рассчитаные на другой формат?

Надо использовать параметры соответствующего типа - и все будет хорошо
25 апр 13, 17:32    [14231598]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Glory
Простоинтересующийся
Почему в SQL Server реализовано так, что бы сделать выборку по дате, надо использовать чаще всего символьную константу определенного формата - 'YYYYMMDD'?

А вы часто прописываете константы в запросах ?
[/quot]
Ну например, пользователь на форме клиентской части ИС выбирает дату отбора, например вводит её по маске ввода: dd.mm.yyyy. Мне надо сформировать константу "наоброт", выкинув точки и передав склеенную строку запроса на обработку серверу.
25 апр 13, 17:32    [14231602]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Простоинтересующийся
(Американский формат даты - fdldate=#12/31/2013#). Что как-то более логично :)

какой то не логичный формат даты с # ИМхо.
25 апр 13, 17:35    [14231620]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Glory
Member

Откуда:
Сообщений: 104760
Простоинтересующийся
Ну например, пользователь на форме клиентской части ИС выбирает дату отбора, например вводит её по маске ввода: dd.mm.yyyy. Мне надо сформировать константу "наоброт", выкинув точки и передав склеенную строку запроса на обработку серверу.

И как форма ввода в диалоге программы обязывает использовать строку, для передачи серверу параметра ?
А не соответствующий тип данных ?
25 апр 13, 17:35    [14231625]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Простоинтересующийся
Glory
пропущено...

А вы часто прописываете константы в запросах ?

Ну например, пользователь на форме клиентской части ИС выбирает дату отбора, например вводит её по маске ввода: dd.mm.yyyy. Мне надо сформировать константу "наоброт", выкинув точки и передав склеенную строку запроса на обработку серверу.[/quot]

А нафига? MS прекрасно жрет такое:

как пример:
select CAST('20130422' AS DATE)

select CAST('14/04/2012' AS DATE)

select CAST('31-12-2013' AS DATE)

select CAST('31.12.2013' AS DATE)
25 апр 13, 17:36    [14231628]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
BlackRaider
Простоинтересующийся
(Американский формат даты - fdldate=#12/31/2013#). Что как-то более логично :)

какой то не логичный формат даты с # ИМхо.

Вы счетаете дату более логично представлять как символьную константу?
'Иванов Иван Иванович' и '20120501' в предикате как бы для разных типов данных, но обрамлены апострофами. :(
Решетки, хотя бы не апострофы. :)
25 апр 13, 17:37    [14231637]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Простоинтересующийся
Ну например, пользователь на форме клиентской части ИС выбирает дату отбора, например вводит её по маске ввода: dd.mm.yyyy. Мне надо сформировать константу "наоброт", выкинув точки и передав склеенную строку запроса на обработку серверу.

используйте парметры типа datetime и пережавайте их сиквелу на обработку,тогда не надо будет городить лисапед
25 апр 13, 17:38    [14231638]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Glory
Member

Откуда:
Сообщений: 104760
Простоинтересующийся
Вы счетаете дату более логично представлять как символьную константу?

Дату лучше всего представлять как дату.
25 апр 13, 17:39    [14231649]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Гость333
Member

Откуда:
Сообщений: 3683
BlackRaider
А нафига? MS прекрасно жрет такое:
как пример:
select CAST('20130422' AS DATE)

select CAST('14/04/2012' AS DATE)

select CAST('31-12-2013' AS DATE)

select CAST('31.12.2013' AS DATE)

А теперь поставьте перед этим "set language us_english", и выполнится только первый вариант, а остальные упадут с ошибкой Conversion failed.
25 апр 13, 17:39    [14231653]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Glory
Простоинтересующийся
Ну например, пользователь на форме клиентской части ИС выбирает дату отбора, например вводит её по маске ввода: dd.mm.yyyy. Мне надо сформировать константу "наоброт", выкинув точки и передав склеенную строку запроса на обработку серверу.

И как форма ввода в диалоге программы обязывает использовать строку, для передачи серверу параметра ?
А не соответствующий тип данных ?

Да не обязывает конечно, можно сделать так flddate=CAST('dd.mm.yyyy') можно, но вот будет ли все это более правильно?
В факе четко написано, что 'YYYYMMDD' - ВСЕГДА интерпретируется правильно, то есть как бы фитча, которая всегда будет работать.
И ВОТ ХОЧЕТСЯ ДЕЛАТЬ ТАК, ЧТО БЫ БЫЛО ВСЕГДА!
25 апр 13, 17:41    [14231662]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Гость333
BlackRaider
А нафига? MS прекрасно жрет такое:
как пример:
select CAST('20130422' AS DATE)

select CAST('14/04/2012' AS DATE)

select CAST('31-12-2013' AS DATE)

select CAST('31.12.2013' AS DATE)

А теперь поставьте перед этим "set language us_english", и выполнится только первый вариант, а остальные упадут с ошибкой Conversion failed.

+1
25 апр 13, 17:42    [14231668]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Простоинтересующийся
И ВОТ ХОЧЕТСЯ ДЕЛАТЬ ТАК, ЧТО БЫ БЫЛО ВСЕГДА!

используйте параметры типа datetime зачем вам ети строки дались
25 апр 13, 17:43    [14231671]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Glory
Member

Откуда:
Сообщений: 104760
Простоинтересующийся
Да не обязывает конечно, можно сделать так flddate=CAST('dd.mm.yyyy')

Какой CAST ?
Сервер должен получить от вас тип date. А не конвертировать за вас строку.

Простоинтересующийся
В факе четко написано, что 'YYYYMMDD' - ВСЕГДА интерпретируется правильно, то есть как бы фитча, которая всегда будет работать.
И ВОТ ХОЧЕТСЯ ДЕЛАТЬ ТАК, ЧТО БЫ БЫЛО ВСЕГДА!

Откройте для себя параметры. И жизнь ваша станет намного легче.
25 апр 13, 17:43    [14231674]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Простоинтересующийся
BlackRaider
пропущено...

какой то не логичный формат даты с # ИМхо.

Вы счетаете дату более логично представлять как символьную константу?
'Иванов Иван Иванович' и '20120501' в предикате как бы для разных типов данных, но обрамлены апострофами. :(
Решетки, хотя бы не апострофы. :)


нее, я считаю что (как вам уже ответили) параметры с клиента передавать нужными типами.
25 апр 13, 17:50    [14231697]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Glory
Простоинтересующийся
Да не обязывает конечно, можно сделать так flddate=CAST('dd.mm.yyyy')

Какой CAST ?
Сервер должен получить от вас тип date. А не конвертировать за вас строку.

Простоинтересующийся
В факе четко написано, что 'YYYYMMDD' - ВСЕГДА интерпретируется правильно, то есть как бы фитча, которая всегда будет работать.
И ВОТ ХОЧЕТСЯ ДЕЛАТЬ ТАК, ЧТО БЫ БЫЛО ВСЕГДА!

Откройте для себя параметры. И жизнь ваша станет намного легче.


Вы имеете в виду передачу с клиента строки с датой 07.05.2013 в таком виде?
CREATE TABLE tblDate(PK int IDENTITY(1,2), DT DATE)
GO
INSERT INTO tblDate(DT) VALUES(CAST('20010507' AS DATE)
GO
DECLARE 
       @D DATE
SELECT @D='07.05.2013'
SELECT DT FROM tblDate WHERE DT=@D
25 апр 13, 17:56    [14231724]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Может я что-то не понимаю, но на клиенте в форме ввод данных выполняется в текстовое поле, я имею текстовую константу.
В любом случае на сервере будет выполняться либо явное, либо неявное приведение типа.
25 апр 13, 18:07    [14231748]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
Простоинтересующийся
Guest
Если только типы данных - дата среды разработки и сервера совпадают.
Но может я использую что-то где нет вообще типа данных date. Есть только строки, целые числа и числа с плавающей точкой.
25 апр 13, 18:09    [14231756]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Простоинтересующийся
Может я что-то не понимаю, но на клиенте в форме ввод данных выполняется в текстовое поле, я имею текстовую константу.
В любом случае на сервере будет выполняться либо явное, либо неявное приведение типа.
Есть ещё один путь - приведение типов будет выполняться на клиенте, а на сервер будут передаваться данные уже в его типе.
25 апр 13, 18:11    [14231767]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Простоинтересующийся
Если только типы данных - дата среды разработки и сервера совпадают.
Но может я использую что-то где нет вообще типа данных date. Есть только строки, целые числа и числа с плавающей точкой.
Может, такие средства разработки клиентских приложений и есть, но я про такие не слышал.
25 апр 13, 18:12    [14231773]     Ответить | Цитировать Сообщить модератору
 Re: Объясните насчет типа данных date  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Простоинтересующийся
Maxx
set dateformat :)

Да, то есть изменив этот параметр, у нас не будут выполняться запросы, которые рассчитаные на другой формат?
Получается, что стандарт неудобный.
Например, в другом продукте microsoft, движке JET. Передаваемые движку символьные инструкции более логичные, например при выборке по дате, надо всегда передавать дату не как символьную константу, а как последовательность МЕСЯЦ, ДЕНЬ, ГОД, разделенных "/" и обрамленных решетками. (Американский формат даты - fdldate=#12/31/2013#). Что как-то более логично :)
Что же здесь логичного?
Если в строке части даты следуют слева направо от большего к меньшему,
то эти строки можно даже сравнивать друг с другом вместо дат без всякого преобразования!
Более идиотских форматов что в датах, что, например, в адресах или в нумерации дней недели,
чем американские, трудно придумать вообще.
25 апр 13, 21:36    [14232219]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить