2013-03-05 15 views
5

Próbuję wstawić NOW do tabeli MySQL. Coś jak:Wstawianie datetime w MSSQL z Coldfusion

<cfset datatime = CREATEODBCDATETIME(Now()) /> 

<cfquery name="qInsert" datasource="#dbanme#" > 
    INSERT INTO TableName(....,date_created, date_modified) 
    VALUES(...,'#datatime#', '#datatime#') 
</cfquery> 

Ale ja otrzymuję następujący błąd:

Invalid JDBC timestamp escape

pomocy?

+2

Nie, że naprawdę ważne, ale jest to MSSQL lub tabeli MySQL? Wymieniasz jeden w pytaniu, a drugi w tytule. W pewnym sensie można użyć funkcji 'Now()' lub funkcji 'getDate()' programu MSSQL, aby uzyskać aktualną datę/czas, bez powodu, aby to zrobić. – Busches

+0

'createODBCDateTime' zwraca obiekt datetime. Obiekty DateTime powinny * nie * być cytowane. [To właśnie powoduje twój błąd składniowy] (http://stackoverflow.com/questions/10057107/insert-date-and-time-into-mysql-withccfusion/10057405#10057405). To powiedziawszy, jak sugerowali inni, powinieneś naprawdę używać cfqueryparam na wszystkich wartościach parametrów zmiennych. – Leigh

Odpowiedz

0

Nie potrzebujesz cytatów wokół wygenerowanych znaczników czasu ColdFusion podczas wstawiania do SQL Server.

Aby rozwinąć, jeśli budować swoją sygnaturę czasową jako ciąg, używając dateformat i etażerka, trzeba wstawić do korzystania z tego formatu:

INSERT INTO TABLE(DATE_COL) VALUES({ts '#dateInAStringFormat#'}) 

Funkcje ColdFusion ODBCx o terminach wykonać całą tę pracę za Ciebie , więc to po prostu:

INSERT INTO TABLE(DATE_COL) VALUES(#dateInAStringFormat#) 
10

Let ColdFusion wypisać dane dla Ciebie - przy użyciu cfqueryparam. Nie jest to absolutnie konieczne, ale dobrze jest go używać, kiedy tylko możesz. Oprócz ochrony przed iniekcją SQL, formatuje ona odpowiednio zmienne, więc nie musisz się martwić o to, czy musisz wstawiać wartości jako ciągi znaków lub liczby całkowite, czy cokolwiek innego.

<cfset datatime = CREATEODBCDATETIME(Now()) /> 

<cfquery name="qInsert" datasource="#dbanme#" > 
    INSERT INTO TableName(....,date_created, date_modified) 
    VALUES(..., 
     <cfqueryparam value="#datatime#" cfsqltype="cf_sql_timestamp">, 
     <cfqueryparam value="#datatime#" cfsqltype="cf_sql_timestamp"> 
    ) 
</cfquery> 
+0

Czy chodziło Ci o 'cf_sql_timestamp'? Ponieważ użycie 'cf_sql_date' usunie każdą porcję czasu i wstawi tylko datę. – Leigh

+0

oops, tak - zwyczaje z naszych własnych praktyk, w których nazywane są odpowiednio 'date_xx' lub' datetime_xx' –

+0

Fajnie, pomyślałem, że to tylko literówka sortów :) Dzięki za aktualizację. – Leigh

3

Jeśli chcesz korzystać z wbudowanego się teraz funkcję, wystarczy umieścić go jako część zapytania:

<cfquery name="qInsert" datasource="#dbname#" > 
    INSERT INTO TableName(....,date_created, date_modified) 
    VALUES(...,NOW(), NOW()) 
</cfquery> 
7

Jeśli chcesz datę, bez czasu, należy użyć następujących:

<cfquery name="qInsert" datasource="#dbanme#" > 
    INSERT INTO TableName(...., date_created, date_modified) 
    VALUES (... 
     , <cfqueryparam cfsqltype="cf_sql_date" value="#now()#"> 
     , <cfqueryparam cfsqltype="cf_sql_date" value="#now()#"> 
    ) 
</cfquery> 

cf_sql_date usunie każdej chwili, w zależności od typu pola pokazują jedynie lub data z 00:00:00 jako wartość czasu albo daty.

Jeśli chcesz randkę z czasem:

<cfquery name="qInsert" datasource="#dbanme#" > 
    INSERT INTO TableName (....,date_created, date_modified) 
    VALUES (... 
     , <cfqueryparam cfsqltype="cf_sql_timestamp" value="#now()#"> 
     , <cfqueryparam cfsqltype="cf_sql_timestamp" value="#now()#"> 
    ) 
</cfquery>