2016-08-27 51 views
0

我使用下面的代碼:如何SQLite.Net-PCL手柄UTC時間

使用新SQLite.Net.SQLiteConnection(新SQLitePlatformWinRT(),DBPATH),以獲得SQLiteConnection 和創建表。

類包含日期時間數據類型

class Transaction 
    { 
     [SQLite.Net.Attributes.PrimaryKey, SQLite.Net.Attributes.AutoIncrement] 
     public int QId { get; set; } 
     public DateTime PurchaseDate { get; set; } 
     public int Amount {get;set;} 
     Public string ItemCode {get;set;}  
    } 

插入數據如下:

var db = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath); 

var newItem = new Transaction() 
    { 
    PurchaseDate = DateTime.Now,    
    Amount = 100, 
    ItemCode = "Abc-C10"    
    }; 

db.Insert(newItem); 

日期將被(636071680313888433 e.g)存儲爲蜱,這是UTC時間。使用上述DateTime.Now,如果我的電腦時間設置爲

1A)在英國時間

1),

將上面的代碼:購買= DateTime.Now正確轉換?

1B)在美國時間,

將上面的代碼:購買= DateTime.Now正確轉換?

如何在SQL語句中處理此刻表?

如何從日期範圍中選擇所有交易?說,2016-07-10至2016-07-20?

感謝

+1

你是什麼意思「正確轉換」?最正確的行爲是沒有轉換。 –

回答

1

與日期,安全的做法是改用DateTimeOffsetDateTime

DateTime沒有包含創建時區的信息,只知道它是UTC還是本地時間,如果數據要在不同的位置使用,這是不夠的。

DateTimeOffset不僅包含時間和日期信息,還包含時區,這意味着結果將始終如您所願。

有它的使用方式沒有差異,只是改變類型:

class Transaction 
{ 
    [SQLite.Net.Attributes.PrimaryKey, SQLite.Net.Attributes.AutoIncrement] 
    public int QId { get; set; } 
    public DateTimeOffset PurchaseDate { get; set; } 
    public int Amount {get;set;} 
    Public string ItemCode {get;set;}  
} 

對於數據庫的訪問:在英國時間

var db = new SQLite.Net.SQLiteConnection(
    new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath); 

var newItem = new Transaction() 
    { 
    PurchaseDate = DateTimeOffset.Now, //or use DateTimeOffset.UtcNow for UTC datetime   
    Amount = 100, 
    ItemCode = "Abc-C10"    
    }; 

db.Insert(newItem); 
+0

如何選擇Sqlite包含UTC時間的日期範圍。可以告訴我這是如何完成的。 – MilkBottle

0

1A),將上面的代碼:purchase = DateTime.Now要正確轉換嗎?

1b)在美國時間, 將上面的代碼:purchase = DateTime.Now是否能正確轉換?

通過「正確地轉換」如果您的意思是轉換爲正確的時間值,答案是肯定的。它將使用刻度轉換爲UTC時間。

如何處理這種蜱在SQL語句?

如何從日期範圍中選擇所有交易?說,2016-07-10至2016-07-20?

從蜱到其他時間單位的皈依是象下面這樣:6億每

  • 蜱:360億種每分鐘
  • 蜱:8640億種每小時
  • 蜱:

    每天
    • 蜱第二:10,000,000
    • 蜱每毫秒:10,000

    所以,你可以使用的SQL語句像下面從2016年7月10日至2016年7月20日獲得的數據:

    SELECT min(PurchaseDate) as 'Date',sum(Qty) as 'Size' from Purchase 
    group by (PurchaseDate/(864000000000*10)) //864000000000*10 = 1day*10 
    order by PurchaseDate 
    

    更新:如果你想選擇的日期2016-07-10和2016-07-20,你可以使用下面的SQL語句:

    select strftime('%Y-%m-%d %H:%M:%S',purchaseDate/10000000 - 62135596800,'unixepoch') as 'date' from purchase where date between '2016-07-10' and '2016-07-20' 
    
  • +0

    @Xia:如何選擇2016-07-10和2016-07-20之間的日期?選擇min(PurchaseDate)作爲'Date',從「」和「」之間購買金額(金額)。如何在雙引號「」內表示日期? – MilkBottle

    +0

    你不能在SQLite中的雙引號內表示日期。 2016-07-10和2016-07-20之間進行選擇,請參閱我的更新。 –

    +0

    @夏:我很快就會回來。非常感謝你。我將努力在這個項目上展示基於微軟UWP的應用程序。我希望我能爲這個SQLite數據表示使用一些很酷的控件和UI。 – MilkBottle