Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Здравствуйте, всем.

Много раз где встречалось, что SSMS должен для отображения даты использовать локальные настройки винды. Так ли это?
С десятичным разделителем прекрасно дружит, достаточно перезапросить запрос после смены в винде.

Менял в обоих английиских SSMS(у меня 12 и 14 стоят) в options->environment->international settings->language с английского на same as windows. Других вариантов там нет (языковых пакетов студии не стоит), винда русская. Без результата.

Если для отображения dd.mm.yyyy нужно ставить русский SSMS, то чем майкрософт это объясняет?

ЗЫ. Конверт просьба не советовать, с ним понятно. Нужно просто для удобства отладки хранимок, порой тяжело читать дату по англицки ;-)
14 янв 20, 14:13    [22058795]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7178
Vladlmlr,

дата 2006-03-26 00:00:00 не устраивает, что ли?
14 янв 20, 16:06    [22058964]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Нет. Не устраивает. От слова совсем.

А вас устраивает?

Ну кроме: просто привык к формату dmy по жизни.
Крайне "удобно" к примеру скопипастить ее и подать на вход хранимке при дефолтном русском языке и dmy формате.
14 янв 20, 16:16    [22058975]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Vladlmlr,

Кто передает дату в формате, отличном от yyyymmdd, рано или поздно начинает страдать.
14 янв 20, 16:19    [22058981]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Простите, но забудьте про строки. Где у меня написано, что я с датами работаю как со сроками? У меня везде на входе и выходе хранимок дата именно ДАТА.

Люди, простой вопрос: SSMS должен для ОТОБРАЖЕНИЯ ДАТЫ использовать локальные настройки винды или зависит от языка SSMS и не лечится?
14 янв 20, 16:27    [22058990]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7178
Vladlmlr
А вас устраивает?

Вполне, т.к. это стандарт. Вы программист или бухгалтер, стесняюсь спросить?
14 янв 20, 16:47    [22059029]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Vladlmlr,

Vladlmlr
Где у меня написано, что я с датами работаю как со сроками?


вот тут написано:

Vladlmlr
"удобно" к примеру скопипастить ее и подать на вход хранимке


Скопипащенное значение как раз будет строковым литералом.
14 янв 20, 17:08    [22059052]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Гавриленко Сергей Алексеевич, я думал понятно:

Крайне "удобно" к примеру скопипастить ее (ДАТУ) и подать на вход хранимке В SSMS при дефолтном русском языке и dmy формате и ВХОДНОМ ПАРАМЕТРЕ ХРАНИМКИ ТИПА ДАТА.
14 янв 20, 17:19    [22059057]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Vladlmlr,

Vladlmlr
примеру скопипастить ее (ДАТУ) и подать на вход хранимке
Вы мне пытаетесь доказать, что литерал в кавычках -- это не строка? Типа если написать '20200101' -- то это строка, а если написать @date = '20200101', то '20200101' перестанет быть строкой?

Vladlmlr
ри дефолтном русском языке и dmy формате
А страдать вы начнете тогда, когда дефотный язык окажется не русским. При этом для строки формата yyyymmdd пофиг, какой установлен язык: этот формат всегда интерпретируется однозначно. Но охота себе усложнять жизнь и расладывать грабельки - на здоровье.
14 янв 20, 17:31    [22059065]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Гавриленко Сергей Алексеевич
Vladlmlr,

А страдать вы начнете тогда, когда дефотный язык окажется не русским. При этом для строки формата yyyymmdd пофиг, какой установлен язык: этот формат всегда интерпретируется однозначно. Но охота себе усложнять жизнь и расладывать грабельки - на здоровье.

Вы сильно удивитесь, но не страдаю и не буду страдать, т.к. дататайму=флоату сильно пофиг какой у вас язык. Представляете, там целая часть за дату отвечает, дробная за время ;-) Для этого собственно типы и придуманы, как правильно трактовать байтики.
Мне искренне жаль, людей которые извращают это понятие и любой тип загоняют в строку. В последний раз: в хранимках входной параметр типа дата, выходные поля типа дата.

Весь вопрос только удобства работы в SSMS. Любое уважающее себя приложение должно показывать данные в соответствии с региональными настройками пользователя. Дробный же разделитель соизволили корректно показать (не остались на своей точке и не кричат, что это стандарт). Чем дата хуже?

Поэтому и простой вопрос: SSMS может показать дату не в формате языка интерфеса и у меня глюк требующий лечения?
ИЛИ этот вопрос останется без ответа?

ЗЫ. Ну простите, что привык к английскому интерфейсу и к русской дате.
15 янв 20, 10:32    [22059490]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
invm
Member

Откуда: Москва
Сообщений: 9010
Vladlmlr
т.к. дататайму=флоату сильно пофиг какой у вас язык. Представляете, там целая часть за дату отвечает, дробная за время ;-)
Vladlmlr
В последний раз: в хранимках входной параметр типа дата, выходные поля типа дата.
Ага. Особенно для типов date, datetime2 и т.п.

Вы что, всерьез считаете, что клиент транслирует дату во внутренний формат и только потом передет серверу?
Если нет, то каким боком формат отображения даты у клиента может влиять на формат даты, воспринимаемый сервером?
15 янв 20, 11:05    [22059525]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Vladlmlr,

Vladlmlr
Вы сильно удивитесь, но не страдаю и не буду страдать, т.к. дататайму=флоату сильно пофиг какой у вас язык. Представляете, там целая часть за дату отвечает, дробная за время ;-) Для этого собственно типы и придуманы, как правильно трактовать байтики.
Мне искренне жаль, людей которые извращают это понятие и любой тип загоняют в строку. В последний раз: в хранимках входной параметр типа дата, выходные поля типа дата.
Ага, дата = флоат, а еще корабли бороздят космическое пространство, бла-бла-бла. Вы вообще не одупляете, о чем вам пишут.

Когда вы копируте якобы дату из вашего рекордсета, то вы копируете строку. Когда вы подставляете значение даты в значение параметра, вы подставляете строку.

В вызове

exec proc @date = 'то, что вы накопировали из рекордсета'


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

В mssql нет возможности задать литерал типа дата-время, как, например задаются бинарные значения через префикс 0x. И обычно входная дата передается серверу строкой. Я очень удивлюсь, если вы найдете хотя бы одну клиентскую библиотеку, которая сделает такой вызов на сервере, после которого в профайлере будет написано

exec proc @date = 234234.23455666
(т.к. якобы дататайму=флоату)

Сообщение было отредактировано: 15 янв 20, 11:22
15 янв 20, 11:21    [22059546]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7178
Гавриленко Сергей Алексеевич,

да, дата во флоат формате говорит о многом...
15 янв 20, 11:45    [22059570]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Гавриленко Сергей Алексеевич

Когда вы копируте якобы дату из вашего рекордсета, то вы копируете строку. Когда вы подставляете значение даты в значение параметра, вы подставляете строку.

В вызове

exec proc @date = 'то, что вы накопировали из рекордсета'


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

Если вы думаете, что это кому то не понятно, жаль. Каждый думает в меру своей испорченности.
Я сталкиваюсь со датой, как со строкой только в SSMS. Ладно бы хоть действительно выдавал в дефолте yyyymmdd, а то или дефисы убирай после копипаста или приводи полностью к русской сессии.
В mssql нет возможности задать литерал типа дата-время, как, например задаются бинарные значения через префикс 0x. И обычно входная дата передается серверу строкой. Я очень удивлюсь, если вы найдете хотя бы одну клиентскую библиотеку, которая сделает такой вызов на сервере, после которого в профайлере будет написано

exec proc @date = 234234.23455666
(т.к. якобы дататайму=флоату)

declare @dt datetime = 1.5
select '1', @dt
select @dt = @dt - 0.5
select '2', @dt
go

CREATE PROCEDURE test @t datetime AS SELECT @t
go

exec test 1.5
exec test '19000102 12:00:00.000'
exec test '1900-01-02 12:00:00.000'

Резалт:
1 1900-01-02 12:00:00.000
2 1900-01-02 00:00:00.000
1900-01-02 12:00:00.000
1900-01-02 12:00:00.000
1900-02-01 12:00:00.000

Наслаждайтесь (отдельно во вложении снимок трейса, где как раз exec test 1.5)

К сообщению приложен файл. Размер - 137Kb
15 янв 20, 12:38    [22059638]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Владислав Колосов
Гавриленко Сергей Алексеевич,

да, дата во флоат формате говорит о многом...

Да. Очень люблю работать с датойтаймом именно как флоат.
Просто прибавить/отнять любое количество дней (целое), любое время накинуть (дробное), откунуть дробную часть(время), получить дату или наоборот откунуть целое и получить время.

Доктор, я болен?
15 янв 20, 12:50    [22059652]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Vladlmlr
Владислав Колосов
Гавриленко Сергей Алексеевич,

да, дата во флоат формате говорит о многом...

Да. Очень люблю работать с датойтаймом именно как флоат.
Просто прибавить/отнять любое количество дней (целое), любое время накинуть (дробное), откунуть дробную часть(время), получить дату или наоборот откунуть целое и получить время.

Доктор, я болен?
Однозначно. Но каждый обладает правом учиться на своих ошибках, поэтому не смею больше вам мешать приобретать драгоценный опыт.
15 янв 20, 16:38    [22059963]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Да признаться в своей пурге тяжело. Но хоть без хамства про оддупляю.
Если бы на ошибку указали конкретно, понял и простил бы.

Может для кого-то будет полезно, а то с такими "гуру": дататайм 8 байтов хранит 4 байта целое - сутки от 1.1.1900, и 4 дробная время,
смолдатайм тоже самое, но 2 + 2. Прекрасно кастится с флоатом и позволяет проводить любые операции над датой, как над флоат и обратно флоат трактовать как дату:

declare @dt datetime = 1
declare @f float = cast(@dt as float)
select 'раз', @dt, @f, cast(@f as datetime), cast(@dt as varbinary(8)), cast(@f as varbinary(8))

select @f = @f + 1.0/24/60/60/300, @dt = @f
select 'два', @dt, @f, cast(@f as datetime), cast(@dt as varbinary(8)), cast(@f as varbinary(8))

резалты:
раз 1900-01-02 00:00:00.000 1 1900-01-02 00:00:00.000 0x0000000100000000 0x3FF0000000000000
два 1900-01-02 00:00:00.003 1,00000003857961 1900-01-02 00:00:00.003 0x0000000100000001 0x3FF000000A5B2BAD

Пальчиком поводите по предпоследнему полю, поймите как хранится дататайм.

Что характерно по теме вопроса НИ СЛОВА ;-(
15 янв 20, 17:18    [22060007]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
Сообщение специально для всех, кто ведется на то, как классно работать с датой через float.

Для работы с датой-временем уже давно сделан необходимый набор функций. На сдачу этот набор функци работает с новыми типами datetime2 и далее по списку.

Товарищ Vladlmlr несет чушь, не слушайте его.
15 янв 20, 17:28    [22060020]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
AndrF
Member

Откуда:
Сообщений: 2154
Vladlmlr

Люди, простой вопрос: SSMS должен для ОТОБРАЖЕНИЯ ДАТЫ использовать локальные настройки винды или зависит от языка SSMS и не лечится?


Он не просто должен, а использует настройки Windows. А вообще - поле даты числовое. Как и в Excel.

Он не просто должен, а использует настройки Windows. Русский SSMS для этого совершенно не нужен. А вообще - поле даты числовое. Как и в Excel.

Вполне себе использую русские региональные настройки. Даты из поля таблицы в строку запроса не копирую - оно мне не сильно-то надо...

Сообщение было отредактировано: 15 янв 20, 17:38
15 янв 20, 17:32    [22060026]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5463
Vladlmlr
Да признаться в своей пурге тяжело.

Если что, напоминаю, что особенно яростное оппонирование началось вот с этого:
Гавриленко Сергей Алексеевич
В mssql нет возможности задать литерал типа дата-время, как, например задаются бинарные значения через префикс 0x. И обычно входная дата передается серверу строкой. Я очень удивлюсь, если вы найдете хотя бы одну клиентскую библиотеку, которая сделает такой вызов на сервере, после которого в профайлере будет написано

exec proc @date = 234234.23455666
(т.к. якобы дататайму=флоату)

Так вот, попробуйте-таки привести пример клиентской библиотеки, у которой в клиентском вызове передается именно datetime, а профайлер показывает передачу числового типа. Мне было бы интересно с такой библиотекой ознакомиться.
Ну, а самому в T-SQL можно делать многое, не являющееся общепринятым, кто ж с этим спорит.
Vladlmlr
Нужно просто для удобства отладки хранимок, порой тяжело читать дату по англицки ;-)

А по-флоатски не тяжело?
15 янв 20, 17:36    [22060035]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
AndrF,
AndrF
Он не просто должен, а использует настройки Windows

Где написано, что должен именно для дат? Если бы не использовал, то у всех с русской локалью getdate() рисовал бы 15.01.2020. А на машинах с английской локалью - 01/15/2020. Очевидно, что SSMS не рисует тип datetime таким образом.

AndrF
А вообще - поле даты числовое.
Поле даты -- это набор байт, который сервер интерпретирует как дату. Поле int -- это набор байт, которые сервер интерпретирует как int. Строка -- это набор байт, которые сервер интерпретирует как строку. Так что все поля числовые.

Сообщение было отредактировано: 15 янв 20, 17:39
15 янв 20, 17:38    [22060039]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
AndrF
Member

Откуда:
Сообщений: 2154
Гавриленко Сергей Алексеевич
AndrF,
AndrF
Он не просто должен, а использует настройки Windows

Где написано, что должен именно для дат? Если бы не использовал, то у всех с русской локалью getdate() возвращал бы 15.01.2020. А на машинах с английской локалью - 01/15/2020. Очевидно, что SSMS не рисует тип datetime таким образом.


Верно. А я что-то стормозил. Рисует 2020-01-16 05:47:16.073. Но видимо так привык, что уже и не замечаю...

Гавриленко Сергей Алексеевич

AndrF
А вообще - поле даты числовое.
Поле даты -- это набор байт, который сервер интерпретирует как дату. Поле int -- это набор байт, которые сервер интерпретирует как int. Строка -- это набор байт, которые сервер интерпретирует как строку. Так что все поля числовые.


Число. Вы вполне можете сделать, к примеру PRINT GETDATE()+0.5. Ну можете считать набором байт, если удобно. Который является числом и обрабатывается в соответствии с настройками локали для данного типа поля.

P.S
Можно ведь и побайтно сравнить...

Сообщение было отредактировано: 15 янв 20, 17:48
15 янв 20, 17:45    [22060054]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36583
AndrF,

AndrF
Вы вполне можете сделать, к примеру PRINT GETDATE()+0.5


А в плане (Scalar Operator(getdate()+'1900-01-01 12:00:00.000'))

Еще, к примеру, я могу пнуть ежика, после чего он полетит, но было бы странно после это считать ежика птицей.
15 янв 20, 18:00    [22060080]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Shakill
Member

Откуда: мск
Сообщений: 1865
AndrF

Число. Вы вполне можете сделать, к примеру PRINT GETDATE()+0.5. Ну можете считать набором байт, если удобно. Который является числом и обрабатывается в соответствии с настройками локали для данного типа поля.

P.S
Можно ведь и побайтно сравнить...


можно ещё написать PRINT '0.5' + 0.5 , вы забыли про неявные преобразования

насчёт побайтно - отличная идея
какой числовой тип соответствует типу datetime? так чтоб хранилось один в один

Сообщение было отредактировано: 15 янв 20, 18:10
15 янв 20, 18:07    [22060086]     Ответить | Цитировать Сообщить модератору
 Re: Английский SSMS + региональные настройки  [new]
Vladlmlr
Member

Откуда:
Сообщений: 17
Наконец-то и до темы вопроса добрались ;-)
Огромное спасибо за это всем не тролям.

AndrF

Верно. А я что-то стормозил. Рисует 2020-01-16 05:47:16.073. Но видимо так привык, что уже и не замечаю...

AndrF, я так и не понял и Вас в двух местах по разному. У вас зависит отображение от региональных настроек? или всегда yyyy-mm-dd?
16 янв 20, 08:55    [22060367]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить