Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    durata time e timestamp c# sqlserver

    ciao.
    Ho un campo in cui devo inserire la durata di un appuntamento , uso sql server 12 ,nella tabella uso un campo time(7) per immagazzinare la durata , il problema è che se la durata è piu grande di un giorno mi da un errore di overflow di sqltype.
    Ho visto cercando su google un post che consigliava di usare un campo bigint e la proprietà tiks di timespan.
    Funziona , ma non so come effettuare le conversioni dopo , io dopo voglio avere un campo dove mi mostra la durata con ore minuti e secondi, anche se i giorni sono piu di uno.
    come è meglio gestire una durata su sqlserver?
    ps.uso vs 2013 , c#e sqlserver 12.
    grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    57
    il campo time di sql può contenere come valore massimo 23:59:59.9999999
    pertanto non puoi avere più di un giorno,

    quello che ti consigliavano è giusto, salvare il valore del DateTime in formato long (bigint) tramite la proprietà Ticks.

    la struttura TimeSpan accetta come argomento nel costruttore un valore long rappresentato da i Ticks, pertanto ti basta eseguire la query sul DB facendoti ritornare indietro i Ticks ed in seguito generi l'oggetto TimeSpan(long tick) con il tuo valore,
    tramite TimeSpan puoi accedere ai singoli campo, giorni, ore, minuti etc.

    codice:
    static void Main(string[] args)
    {
      DateTime from   = new DateTime(2016, 01, 23, 12, 00, 00);
      DateTime to     = new DateTime(2016, 01, 25, 10, 30, 30);
    
    
       // intervallo long (bigint) da inserire nel DB.
       long deltaToDB = to.Ticks - from.Ticks;
      Console.WriteLine("delta: " + deltaToDB);
    
    
      // intervallo long (bigint) da prelevare dal DB.
      long deltaFromDB = deltaToDB;
      TimeSpan deltaTime = TimeSpan.FromTicks(deltaFromDB); // oppure new TimeSpan(deltaFromDB);
      Console.WriteLine("deltaTime: " + deltaTime); // output: 1d 22h 30m 30s
    
      Console.ReadLine();
    }

    PS: se nel tuo DB salvi già la data di inizio appuntamento e di fine appuntamento, ti sconsiglierei di salvare l'intervallo, essendo facilmente calcolabile, altrimenti ad ogni cambio di una di queste due date dovresti aggiornare ogni volta anche il campo di intervallo, in seguito se qualcosa non va come dovrebbe inizieresti ad avere dati inconsistenti.
    Ultima modifica di Marsh; 25-01-2016 a 13:59

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.