2013-03-20 22 views
11

Sto cercando di creare la mia prima funzione memorizzata su MySQL. In questa funzione voglio restituire il timestamp della data e dell'ora corrente con 3 cifre di microsecondo come questa: YYYYMMDDHHMMSSZZZCome recuperare i microsecondi o millisecondi dall'ora attuale MySQL?

Io uso questo numero nel mio database per creare chiavi univoche per i miei record offline in modo che non si blocchino quando il mio i sistemi uniscono database da diversi server offline.

Quindi il mio primo tentativo per quella era SELECT CAST(MICROSECOND(NOW()) AS CHAR(3));

Ma restituisce 0.

Se provo SELECT CAST(MICROSECOND('2009-12-31 23:59:59.001210') AS CHAR(3));

Esso restituisce 121, come ho bisogno.

Quindi, come dire a MySQL che voglio conoscere i microsecondi del tempo corrente?


EDIT:

Considerate questo:

CREATE FUNCTION CHAVE (pTable VARCHAR(32)) RETURNS CHAR(20) 
BEGIN 
    DECLARE vSigla CHAR(3); 
    DECLARE vDateTime CHAR(14); 
    DECLARE vMilli CHAR(3); 
    DECLARE vKey CHAR(20); 
    SET vSigla = (SELECT SIGLA FROM TABLELIST WHERE NOME = pTable); 
    SET vDateTime = (SELECT CAST(LEFT(UTC_TIMESTAMP()+0, 14) AS CHAR(14))); 
    SET vMilli = LPAD(FLOOR(RAND() * 1000), 3, '0'); 
    SET vKey = CONCAT(vSigla, vDateTime, vMilli); 
    RETURN vKey; 
END; 

Il risultato di:

INSERT INTO TABLEX (dateID, name) VALUES (CHAVE('TABLEX'), 'EASI'); 

Sarà, da CHAVE ('Tablex'):

KEY20130320151159666 

Dove 666 sarà un numero casuale, ma vorrei che fosse il conteggio dei millisecondi effettivi dell'ora corrente, quindi non ho la chiave duplicata possibile.


Se solo potessi usare SHOW COLUMNS FROM @TableName WHERE FIELD_NAME LIKE '%_ID' LIMIT 1 e inserire che in un SELEZIONE non dinamico per ottenere il millisecondo dell'ultimo record di quel tavolo ...

+0

Si tratta di un bug in MySQL versione 5.6.4 che ve siete su? –

+0

Uso HostGator.com che utilizza MySQL 5.5.21 come detto in http://support.hostgator.com/articles/hosting-guide/hardware-software/what-software-and-program-versions-does-hostgator-offer – PSyLoCKe

+0

La mia versione MySQL locale è 5.1.5 da Zend Server 5 CE – PSyLoCKe

risposta

24

MySQL 5.6 supporta la precisione in millisecondi nella funzione sysdate.

provare

select sysdate(6) tornerà 2013-04-16 13:47:56.273434

e

select sysdate(3) sarà tornare 2013-04-16 13:47:56.273

+2

per MySQL 5.6.4 e successive, secondo i documenti (http://dev.mysql.com/doc/refman/5.6/en/date-and- time-functions.html # function_sysdate) – bitsoflogic

5

Date un'occhiata a quello che dice MySQL (http://dev.mysql.com/doc/refman/5.1/en/fractional-seconds.html) :

However, when MySQL stores a value into a column of any temporal data type, it discards any fractional part and does not store it.

Quindi è necessario conservarlo non come un valore di data, ma come un semplice valore in virgola mobile.

+1

5.1 potrebbe dirlo. 5.6 dice anche questo - ma espande il punto in alcuni modi importanti, quindi la domanda cruciale è 'quale versione usa l'OP?' – Strawberry

+0

Non sto cercando la memoria, ma solo per recuperare dal datetime corrente del sistema come detto nella domanda. Lo salverò come valore stringa YYYYMMDDHHMMSSZZZ – PSyLoCKe

+0

Se la tua versione di MySQL non è abbastanza nuova, non sarà in grado di ottenere una parte più piccola di 1 secondo. È meglio utilizzare il linguaggio di scripting sul lato server per recuperarlo e quindi inserire la query. – aram90

3

per MySQL 5,6

round(unix_timestamp() * 1000 + MICROSECOND(sysdate(6))/1000) 
+0

non funziona per me –

+0

Funziona alla grande su 5.6.32 per me. –