Вставить значение даты и времени с помощью функции GetDate () в таблицу сервера SQL (2005)? - PullRequest
3 голосов
/ 11 июня 2010

Я работаю (или исправляю ошибки) над приложением, разработанным в VS 2005 C #. Приложение сохраняет данные на SQL-сервере 2005. Один из операторов вставки SQL пытается вставить значение метки времени в поле с функцией TSQL GetDate () в качестве значения даты и времени.

Insert into table1 (field1, ... fieldDt) values ('value1', ... GetDate());

Причина использования функции GetDate () заключается в том, что сервер SQL может находиться на удаленном сайте, а дата и время могут находиться в разном часовом поясе. Поэтому GetDate () всегда будет получать дату с сервера. Поскольку эту функцию можно проверить в SQL Management Studio, я получаю следующее:

SELECT GetDate(), LEN(GetDate());
-- 2010-06-10 14:04:48.293   19

Одна вещь, которую я осознаю, состоит в том, что длина не равна миллисекундам, то есть 19 фактически соответствует «2010-06-10 14:04:48». В любом случае, проблема, с которой я столкнулся сейчас, заключается в том, что после вставки fieldDt фактически имеет значение даты и времени вплоть до минут, например, «2010-06-10 14:04:00». Я не уверен почему. У меня нет разрешения на обновление или изменение таблицы с помощью триггера для обновления поля.

Мой вопрос заключается в том, как я могу использовать INSERT T-SQL для добавления новой строки со значением даты и времени (локальное время сервера SQL) с точностью до миллисекунд?

Ответы [ 5 ]

3 голосов
/ 11 июня 2010

Проверьте свою таблицу. Я предполагаю, что столбец FieldDT имеет тип данных SmallDateTime, который хранит дату и время, но с точностью до минуты. Если мои предположения верны, вы не сможете хранить секунды или миллисекунды, если не измените тип данных столбца.

1 голос
/ 11 июня 2010

Я полагаю, что вы не храните значение GetDate () в поле DateTime.Если вы сохраните значение в поле даты и времени, вы получите максимальную точность, допускаемую типом DateTime.Кроме того, DateTime - это двоичный тип (фактически двойной), поэтому 19 означает 19 байтов, а не 19 символов.

Попробуйте создать простую таблицу с полем Datetime, например

CREATE TABLE [dbo].[DateTable](
[DateField] [datetime] NOT NULL
)

добавьте дату с помощью

insert into datetable (datefield) values(getdate())

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

select *  from datetable

возвращает

2010-06-11 00: 38: 46,660

0 голосов
/ 25 января 2017

Вы можете использовать это в процедуре, а если процедуры нет, используйте только getdate () .

вставьте в [dbo]. [Tbl_User] (UserId, Uvendoremail, UAddress,Значения Ddob, DMobile, DEmail, DPassword, DAddress, CreatedDate ) (@ userid, @ vendoremail @ address, @ dob, @ mobile, @ email, @ dpassword, @ daddress, getdate () )

0 голосов
/ 11 июня 2010

Поскольку вы работаете в SQL 2005, не забывайте функцию getutcdate (), чтобы гарантировать, что независимо от того, где ваши серверы на самом деле расположены, у вас будет постоянная ссылка на время.

Представьте себе, у вас есть сервер в Великобритании зимой (т.е. GMT + 0), и сохраните запись в 10:30. Затем вы переключаетесь на сервер SQL, расположенный в Калифорнии (GMT + 8), и спустя 8 часов сохраняете другую запись.

Используя getdate (), обе записи сохраняются в одно и то же время "10:30:00". Используя getutcdate (), первое сохранение записей в «10:30:00», второе сохранение записей «18:30:00».

Не совсем отвечаю на вопрос, но важно в ваших обстоятельствах.

0 голосов
/ 11 июня 2010

Может быть, это сработает вместо getdate - SYSDATETIME () посмотрите здесь, если сможете найти то, что вам нужно - http://msdn.microsoft.com/en-us/library/ms188383.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...