137

この列定義を持つ sqlite (v3) テーブルがあります。

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

このデータベースが存在するサーバーは、CST タイム ゾーンにあります。タイムスタンプ列を含めずにテーブルに挿入すると、sqlite はそのフィールドに CST ではなく GMT の現在のタイムスタンプを自動的に入力します。

挿入ステートメントを変更して、保存されたタイムスタンプを強制的に CST にする方法はありますか? 一方、おそらくGMTで保存する方が良いでしょう(たとえば、データベースが別のタイムゾーンに移動した場合)。選択したSQLを変更して、保存されたタイムスタンプをCSTに変換する方法はありますか?テーブルから抽出しますか?

4

11 に答える 11

162

sqlite のドキュメント ( https://www.sqlite.org/lang_datefunc.html ) で次のテキストを見つけました。

UNIX タイムスタンプ 1092941466 を指定して日付と時刻を計算し、ローカル タイムゾーンを補正します。

SELECT datetime(1092941466, 'unixepoch', 'localtime');

それは私のニーズに合っていないように見えたので、「datetime」関数を少し変更してみましたが、次のようになりました。

select datetime(timestamp, 'localtime')

それはうまくいくようです-それはあなたのタイムゾーンに変換する正しい方法ですか、それともこれを行うためのより良い方法はありますか?

于 2008-12-19T16:04:28.907 に答える
80

デフォルトとして単純に現地時間を使用します。

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
于 2010-05-30T14:42:08.777 に答える
22

原則として、タイムスタンプを GMT でデータベースに残し、ユーザー (サーバーではなく) のローカルタイムスタンプに変換できる場合にのみ、入力/出力でローカル時間との間で変換する必要があります。

以下のようにすればよかったです。

SELECT DATETIME(col, 'PDT')

...太平洋夏時間のユーザーのタイムスタンプを出力します。残念ながら、それはうまくいきません。ただし、この SQLite チュートリアル(「その他の日付と時刻のコマンド」までスクロールダウン) によると、時刻を尋ねてから、同時にオフセット (時間単位) を適用できます。したがって、ユーザーのタイムゾーン オフセットがわかっている場合は問題ありません。

ただし、夏時間の規則には対応していません...

于 2008-12-19T16:08:51.223 に答える
16

(認められたまれな) ローカル データタイムが必要な場合 (たとえば、ローカル時間をデータベースの 1 つに保存します。気にするのは 1 日の時刻だけであり、自分がどこにいたかを追跡していないためです)タイムゾーンに関して...)、列を次のように定義できます

"timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime'))

%Y-%m-%dT%H:%M 部分はもちろんオプションです。それは私が自分の時間を保存するのが好きな方法です。[また、私の印象が正しければ、sqlite には「DATETIME」データ型は存在しないため、カラム宣言のデータ型として TEXT を使用するか、DATETIME を使用するかはあまり問題ではありません。]

于 2009-02-21T03:38:59.617 に答える
9

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')

于 2015-04-22T14:36:05.160 に答える
9

When having a column defined with "NOT NULL DEFAULT CURRENT_TIMESTAMP," inserted records will always get set with UTC/GMT time.

Here's what I did to avoid having to include the time in my INSERT/UPDATE statements:

--Create a table having a CURRENT_TIMESTAMP:
CREATE TABLE FOOBAR (
    RECORD_NO INTEGER NOT NULL,
    TO_STORE INTEGER,
    UPC CHAR(30),
    QTY DECIMAL(15,4),
    EID CHAR(16),
    RECORD_TIME NOT NULL DEFAULT CURRENT_TIMESTAMP)

--Create before update and after insert triggers:
CREATE TRIGGER UPDATE_FOOBAR BEFORE UPDATE ON FOOBAR
    BEGIN
       UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
       WHERE rowid = new.rowid;
    END

CREATE TRIGGER INSERT_FOOBAR AFTER INSERT ON FOOBAR
    BEGIN
       UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
       WHERE rowid = new.rowid;
    END

Test to see if it works...

--INSERT a couple records into the table:
INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
    VALUES (0, 1, 'xyz1', 31, '777')

INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
    VALUES (1, 1, 'xyz2', 32, '777')

--UPDATE one of the records:
UPDATE foobar SET price = 29 WHERE upc = 'xyz2'

--Check the results:
SELECT * FROM foobar

Hope that helps.

于 2009-08-11T18:11:17.640 に答える
9
SELECT datetime('now', 'localtime');
于 2014-01-16T17:53:23.507 に答える
4

strftime() を使用して、時刻列をタイムスタンプに変換することもできます。

SELECT strftime('%s', timestamp) as timestamp FROM ... ;

あなたにあげる:

1454521888

current_timestamp'timestamp' テーブルの列は、デフォルトとしてを使用して、テキスト フィールドにすることもできます。

strftime なし:

SELECT timestamp FROM ... ;

あなたにあげる:

2016-02-03 17:51:28

于 2016-02-03T18:01:01.483 に答える
3

これが役立つかもしれないと思います。

SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');
于 2009-02-20T23:46:43.310 に答える
3

マシンのタイムゾーンでの現在の時刻:

select time(time(), 'localtime');

http://www.sqlite.org/lang_datefunc.htmlに従って

于 2012-11-14T02:22:32.480 に答える