2015-10-26 60 views
4

使用ColdFusion(Lucee 4.5),我需要在我的MSSQL數據庫中插入包含毫秒的datetime值。我創建一個UTC日期時間值是這樣的:使用ColdFusion將毫秒數據插入到MSSQL數據庫中使用ColdFusion

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

然後我用下面的SQL代碼中插入:

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

然而,這種方法不包括毫秒。插入分貝的值是這樣的:

2015-10-26 02:14:07.000 

最後3級的.(週期)後的數字在端部是第二符號(1/300)的MSSQL的分數,這始終是.000

如何包含毫秒或幾分之一秒? 1/300很好。

+1

什麼是列'theTime'的類型? SQL Server的'datetime'只保存時間到1/300秒。 'DATETIME2'默認爲第二個分辨率,但可以指定爲毫秒,'datetime2(3)'。 –

+0

我正在使用datetime ...我只是看着它,是的,我可能需要使用datetime2,但我不認爲ColdFusion(或Lucee在我的情況)發送毫秒數據庫。 – Redtopia

+1

警告!我試圖轉換爲datetime2,但jtds odbc驅動程序不支持它,所以我的日期已關閉。 – Redtopia

回答

5

我目前無法與Lucee一起測試,但我懷疑問題不在於使用cfqueryparam。 CF11下的結果相同。要插入日期和時間,包括毫秒,使用cfqueryparam型時間戳,不createODBCDateTime:

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

更新:

由於Redtopia mentioned in the comments,在CFSCRIPT版本將addParam()

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

我今天會測試這個......我認爲你是對的。在某些時候(可能是CF9),我退出使用帶日期的cfqueryparam,可能是因爲我也在使用CreateODBCDateTime()。我想這是有道理的,當你使用cfqueryparam時,你不需要使用CreatedODBCDateTime()。 – 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

是的,使用數據庫功能也可以。 @Redtopia - 雖然通常最好使用其中一種。如果CF和數據庫位於不同的服務器上,則兩者都會導致問題。 – Leigh

+0

我第二次Leigh的評論 - 如果你關心毫秒,你不想混合 - 如果兩個服務器之間的時間有一點點,你會有問題。您需要一個時間源 - 並將其同步到時間服務器。取決於你的版本。的Windows服務器可能會自動爲您設置。但是這種方式非常簡單。 –

+0

有道理......無論我是從應用層還是db層生成時間,我都會在分佈式環境中遇到同步問題。 – Redtopia

相關問題