С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
1

Глюки с датой в Microsoft SQL

14.02.2008, 22:07. Просмотров 2931. Ответов 20
Метки нет (Все метки)

Ситуация такая:

Ввожу дату формате dd.mm.yyyy - SQL выдает ошибку при dd>12. То есть восринимает дату в формает mm.dd.yyyy

Если ввести дату в формате mm.dd.yyyy сохраняет в формате dd.mm.yyyy

Поясню на конкретном примере.
31 декабря 2001 года.

В русском стандаре : 31.12.2001
В американском : 12.31.2001

INSERT INTO ... () VALUES ('31.12.2001') - SQL выдает ошибку неверный формат даты
INSERT INTO ... () VALUES ('12.31.2001') - SQL не выдает ошибку но в таблице сохраняет в виде '31.12.2001'

INSERT INTO ... () VALUES (GETDATE()) - в таблице будет значение '31.12.2001' если сегодня 31 декабря 2001г.

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

Или я чего то не понимаю...
Вообщем у кого какие соображения по этому поводу. или может кто то сталкивался уже с этим.
Заранее спасибо за ответы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2008, 22:07
Ответы с готовыми решениями:

Переучиться с Oracle на Microsoft SQL Server
Насколько это сложно? Сколько времени это может занять? Заранее спасибо.

Microsoft SQL Server 2000 для профессионалов
Очень желал бы купить книгу 'Microsoft SQL Server 2000 для профессионалов'......

На какую SQL лучше всего перейти (из Microsoft Access 2016)?
Пытаюсь понять – надо ли и как переходить с Microsoft Access 2016 (далее –...

Глюки foreign keys?
Сейчас устроился на новую работу. Раньше, когда я создавал базы данных, всегда...

Возможно ли импортировать базу данных из Microsoft SQL 2016 в Microsoft SQL 2014?
Ребят помогите плиз.. Возможно ли импортировать базу данных из Microsoft SQL...

20
msd
14.02.2008, 22:17 2
Сервер хранит в соответствии с региональными установками, но у SQL (у самого языка) свои требования.
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
15.02.2008, 14:21  [ТС] 3
то есть дату можно вставлять в SQL операторы только в соответствии с ANSI SQL (то есть а американском стандарте)?
0
Alexey
0 / 0 / 3
Регистрация: 27.03.2012
Сообщений: 5
15.02.2008, 14:26 4
...или использовать ф-ю to_date для преобразования из нужного формата:

to_date('19.02.2001','dd.mm.yyyy')
0
Антон#
0 / 0 / 0
Регистрация: 14.02.2008
Сообщений: 25
17.02.2008, 14:37 5
при использовании даты в инструкциях SQL следует руководствоваться требованиями синтаксиса, которые говорят. что даты должны передаваться в формате mm/dd/yy.
Отображение дат будет происходить в соответствии с региональными настройками.
Следует помнить, что в SQL даты передаются именно текстовой строкой, хотя на самом деле, дата - это число. Поэтому при употреблении в SQL переменной типа дата/время всегда следует использовать функцию форматирования даты по заданному шаблону. так, например, в MAccess
T-SQL
1
2
3
select Tbl.date
from Tbl
where Tbl.date = Format(DateParam, '#mm/dd/yy#');
где DateParam - переменная типа дата/время
0
DmitryV
18.02.2008, 11:00 6
А можно предварительно устанавливать нужный формат командой
SET DATEFORMAT <format>
AiK
18.02.2008, 11:04 7
Блин, используйте нормальный формат дат dd mmm yyyy (разделители любые) и проблем не будет.
З.Ы: а за двуциферный год руки бы поотрывал
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
18.02.2008, 11:43  [ТС] 8
>...или использовать ф-ю to_date для преобразования из нужного >формата:

>to_date('19.02.2001','dd.mm.yyyy')

Что то не нашел я такой функции в документации по SQL Server-у.
Smalig, эТо функция или хранимая процедура?
0
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
18.02.2008, 11:46  [ТС] 9
>З.Ы: а за двуциферный год руки бы поотрывал

зачем же так сразу руки отрывать А дату каждый хранит так как ему больше нравиться. Мне лично больше нравиться числовой формат.

И кстати с датами типа 11 Dec 2001 тоже проблем хватает. Так что кому еще руки надо отрывать можно еще поспорить.. Шучу.
0
Alexey
0 / 0 / 3
Регистрация: 27.03.2012
Сообщений: 5
18.02.2008, 11:46 10
блин, нет такой функции, это в оракле, сорри, ошибся
0
Alexey
0 / 0 / 3
Регистрация: 27.03.2012
Сообщений: 5
18.02.2008, 11:52 11
'Working with Dates'
http://www.swynk.com/friends/trach/WorkingWithDates.asp
0
AiK
18.02.2008, 11:57 12
>Сервер хранит в соответствии с региональными установками, но у SQL (у самого языка) свои требования
Для справки. Сервер хранит дату в 109 формате. А возвращает в соответствии с настройками.
AiK
18.02.2008, 12:06 13
>И кстати с датами типа 11 Dec 2001 тоже проблем хватает.
Только у клиентщиков. Но это их проблемы. Им всё равно даты конвертить придётся. Т.к. на клиентской машине локаль может быть любая и серверу до этого никакого дела нет.
И ещё, представь, что ты разработал приложение для Васи Пупкина, и настроил сервер так, чтобы он понимал даты в 104 формате. А теперь представь, что твою приладу захотел купить John Smit. А он как известно любит 101 формат. Что делать-то будешь?
В моём случае - ничего не надо
Alexey
0 / 0 / 3
Регистрация: 27.03.2012
Сообщений: 5
18.02.2008, 12:10 14
>> Мне лично больше нравиться числовой формат.

да, AiK прав, дату надо хранить как положено, например, с числовым форматом как ты ищешь разницу между датами? или как проверить, что дата входит в промежуток между двумя другими?
0
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
18.02.2008, 12:32  [ТС] 15
>да, AiK прав, дату надо хранить как положено, например, с числовым >форматом как ты ищешь разницу между датами? или как проверить, что >дата входит в промежуток между двумя другими?

во первых все операции с датами выполняет сам сервер. И в каком формате она представлена в таблице не важно.

Не важно записать дату в виде 31.12.2001 или 12 Dec 2001 то в конечном счете где-то в глубине SQL сервера она все равно предстваляется в виде целого числа, а мы видим только внешнее представление этого числа (которое кстати и задается в командой SET DATEFORMAt)

И все операции с датами (арифметические, логические) эквивалентны операциям с целыми числами и не важно в каком виде они представлены в таблоцах.
0
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
18.02.2008, 13:48  [ТС] 16
...чего то все поутихли
0
Alexey
0 / 0 / 3
Регистрация: 27.03.2012
Сообщений: 5
18.02.2008, 13:59 17
так чего поутихли? тебе что в лоб, что по лбу :-)

у тебя поле числовое? int? как находишь разницу между датами?
0
parashin
0 / 0 / 0
Регистрация: 21.06.2007
Сообщений: 654
18.02.2008, 15:19  [ТС] 18
ну допустим с помощью функции DATEDIFF(). Ей насколько я понимаю все равно в каком формате дата.
0
dimzon
18.02.2008, 17:53 19
Вообще-то при вставке в таблицу чтобы голова не болела можно использовать один из 2-х приёмов:
1 - insert into ... values('20011211'), где 20011211 - дата в виде yyyymmdd (Unseparated date format называется - жуется 100%)
2 - если ты пихаешь дату из кода - используй параметризованный запрос !!! Тогда тоже никаких проблем не будет

А при сравнении дат если не нужно учитывать время - используйте datediff...
dimzon
18.02.2008, 17:58 20
>И все операции с датами (арифметические, логические) эквивалентны
>операциям с целыми числами и не важно в каком виде они представлены
>в таблоцах.

Поправочка!!!! Физически в MSSQL (и ваще почти везде у микрософта под виндами) дата хранится как действительное число двойной точности, где целая часть - число дней от января 1899, а дробная - каким-то образом закодированное время (эт я не уточнял)
18.02.2008, 17:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2008, 17:58

Чем отличается Microsoft® SQL Server® 2008 Express with Tools от Microsoft® SQL Server® 2008 Express with Adva
Друзья! Есть две СУБД, как я понимаю: Microsoft® SQL Server® 2008 Express...

SQL: найти разницу между текущей датой и датой заключения договора
Здравствуйте! Помогите, пожалуйста, с запросом SQL. Есть база данных в Access....

Тип ошибки: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'AL_AS
Я только начинаю, это мой первый пробный пример и никак не могу начать: Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru