2015-10-26 1 views
4

Используя ColdFusion (Lucee 4.5), мне нужно вставить значения datetime, которые включают миллисекунды в мою базу данных MSSQL. Я создаю значения даты и времени UTC, как это:Вставить datetime с миллисекундами в базу данных MSSQL с использованием ColdFusion

nowUTC = dateConvert("Local2UTC", now()); 
nowODBC = createODBCDateTime(nowUTC); 

Затем я использую следующий код SQL для вставки:

insert into tbl (theTime) values (#nowODBC#) 

Однако этот метод не включает миллисекунды. Значения, вставленные в БД выглядеть следующим образом:

2015-10-26 02:14:07.000 

Последние 3 цифры после . (период) в конце концов, это фракция MSSQL по второй записи (1/300), который всегда .000

Как включить миллисекунды или долю секунды? 1/300 в порядке.

+1

Какой тип столбца 'theTime'? SQL Server 'datetime' занимает время только 1/300 секунды. «DATETIME2» по умолчанию имеет второе разрешение, но может быть указано в миллисекундах, 'datetime2 (3)'. –

+0

Я использую datetime ... Я просто просмотрел его и да, мне, вероятно, нужно использовать datetime2, но я не думаю, что ColdFusion (или Lucee в моем случае) отправляет миллисекунды в db. – Redtopia

+1

ВНИМАНИЕ! Я попытался преобразовать в datetime2, но драйвер jtds odbc не поддерживает его, и поэтому мои даты были отключены. – Redtopia

ответ

5

Я не могу проверить с Люси в данный момент, но я подозреваю, что проблема не используется cfqueryparam. Результаты аналогичны для CF11. Чтобы вставить дату и время, включая миллисекунды, используйте cfqueryparam с типом метки времени, не createODBCDateTime:

<cfquery ....> 
    INSERT INTO tbl (theTime) 
    VALUES 
    ( 
    <cfqueryparam value="#nowUTC#" cfsqltype="cf_sql_timestamp"> 
    ) 
</cfquery> 

Update:

Как Redtopia mentioned in the comments, версия cfscript будет addParam():

query.addParam(name="theTime" 
       , value=nowUTC 
       , cfsqltype="cf_sql_timestamp" 
      ); 
+0

Я испытаю это сегодня ... Я думаю, что ты прав. В какой-то момент (возможно, CF9) я перестаю использовать cfqueryparam с датами, вероятно, потому, что я также использовал CreateODBCDateTime(). Я предполагаю, что имеет смысл, что вам не понадобится CreateODBCDateTime() при использовании cfqueryparam. – Redtopia

+1

Я не использовал CreateODBCDateTime через некоторое время, но я думаю, что миллисекунда есть, но не вставлена, если не используется cfqueryparam с 'cf_sql_timestamp'. Хотя вам не нужно создавать CreateODBCDateTime, я просто вспомнил, что [Adobe делала какие-то странные вещи с датами UTC] (http://stackoverflow.com/questions/32534490/how-to-get-datecompare-to-behave-in-coldfusion-10/32546195 # 32546195). Поэтому, если это существующий код, выполните некоторые тесты, чтобы убедиться, что конечные результаты ожидаются.Надеюсь, реализация Lucee более разумна ;-) – Leigh

+1

Просто протестировал ее, и она работает без использования 'CreateODBCDateTime()' и 'cfqueryparam' или' query.addParam (name = "theDate", value = nowUTC, cfsqltype = "cf_sql_timestamp") ' – Redtopia

4

Попробуйте направлять запрос на использование одного из родных sql серверных функций для текущей метки времени, включая миллисекунду, это будет зависеть от того, какая версия MS SQL вы используете. См GETDATE (Transact-SQL) и GETUTCDATE (Transact-SQL)

Вы можете найти что-то вроде этого является то, что вы хотите:

insert into tbl (theTime) values (GETUTCDATE()) 

пример:

GETUTCDATE() = 2015-10-27 20:10:02.047 
+1

Да, использование функций базы данных также будет работать. @ Редтопия. Хотя обычно лучше использовать ту или иную. Использование обоих может вызвать проблемы, если CF и база данных находятся на разных серверах. – Leigh

+0

I второй комментарий Ли - если вас беспокоит миллисекунды, вы не хотите иметь микс - если время между двумя серверами будет немного меньше, у вас будут проблемы. Вам нужен один источник времени - и синхронизируйте его с сервером времени. В зависимости от вашей версии. сервера Windows, это может быть настроено автоматически для вас. Но это довольно легко в любом случае. –

+0

У меня есть смысл ... Я создаю время с уровня приложения или слоя db, и я буду сталкиваться с проблемами синхронизации в распределенной среде. – Redtopia

Смежные вопросы