2016-03-22 17 views
0

Hemen öncesinde: Bu, bir mobil uygulamanın arka ucudur, bu nedenle saat dilimi ile ilgili soru şu şekilde ortaya çıkar.Çalışma saatleri için TIMESTAMP ZAMAN ZAMANI İHTİYACIM VAR MI?

Sadece bu kafamı alınamıyor. shop_times numaralı telefonu kullanıyorum. Bu bilgileri günün hangi saatinden bir dükkanın açıldığı günün başka bir zamanına kadar saklıyorlar.

ben de bu shop_times oldu veya geçerli olanı dönemde anlatır aralığını depolamak, hangi zamanda bir shop_offer teklif edildi söylemek mümkün istediğimiz için. Bir shop_offer kendisi Tüm bu aralıkları için TIMESTAMP WITH TIME ZONE kullanıyorum anda. O geçerli olduğu bir dönem vardır ama gerçekten ihtiyacın varsa söyleyemem.

kullanıcı Londra'da ve teklifler ve kullanılabilir olduklarında süreyi görmek istiyorsa, ben sadece ona bir dükkan sahibi tarafından tanımlanan tarih ve saati gönderebilir. Ben de aslında burada saat dilimi bilgilerini gerekmez düşünüyorum bu nedenle nereye bu kadar yerel saati görüntüleyebilir. Öte yandan

, saat dilimi bilgileri olmadan ben isteyemem, çünkü örneğin " kaç saat bu mevcut olduğunu" Mobil kullanıcının farklı bir saat diliminde olabileceğini bildirmek için 2016-03-22 08:00:00 yeterli değildir. Ancak, saat dilimini sadece shop varlığımın içine kaydedebilirim. Sonuçta, saat dilimini belirleyen dükkanın yeri. Dolayısıyla, bir mobil kullanıcı bu soruyu sorarsa, ona sadece mağazanın saat dilimini gönderebilir ve bunun cevabını hesaplayabilir.

Yani .. Ben saat dilimi bilgileri olmadan veya dönem bilgisini saklamalıyım?

CREATE TABLE shop_times (

    -- PRIMARY KEY 

    id BIGSERIAL NOT NULL, 

    shop_id BIGINT NOT NULL, 

    CONSTRAINT fk__shop_times__shop 
     FOREIGN KEY (shop_id) 
     REFERENCES shop(id), 

    PRIMARY KEY (id, shop_id), 

    -- ATTRIBUTES 

    valid_from_day TIMESTAMP WITH TIME ZONE NOT NULL, 
    valid_until_day TIMESTAMP WITH TIME ZONE NOT NULL, 

    time_from TIME WITHOUT TIME ZONE NOT NULL, 
    time_to TIME WITHOUT TIME ZONE NOT NULL, 

    -- CONSTRAINTS 

    CHECK(valid_from_day <= valid_until_day), 

    CHECK(time_from < time_to) 

); 


CREATE TABLE shop_offer_time_period (

    -- PRIMARY KEY 

    shop_times_id BIGINT NOT NULL, 

    shop_offer_id BIGINT NOT NULL, 

    shop_id BIGINT NOT NULL, 

    CONSTRAINT fk__shop_offer_time_period__shop_times 
     FOREIGN KEY (shop_times_id, shop_id) 
     REFERENCES shop_times(id, shop_id), 

    CONSTRAINT fk__shop_offer_time_period__shop_offer 
     FOREIGN KEY (shop_offer_id, shop_id) 
     REFERENCES shop_offer(id, shop_id), 

    PRIMARY KEY (shop_times_id, shop_offer_id, shop_id), 

    -- ATTRIBUTES 

    valid_for_days_bitmask INT NOT NULL, 

    price REAL NOT NULL, 

    valid_from_day TIMESTAMP WITH TIME ZONE NOT NULL, 
    valid_until_day TIMESTAMP WITH TIME ZONE NOT NULL, 

); 

cevap

0

birkaç nokta nota:

  • TIMESTAMP WITH TIME ZONE

    saat dilimini saklamaz benim tablolar şu anda nasıl göründüğünü

    budur. Bu sadece Postgres'in geçerli TIMEZONE ayarını uyguladığı anlamına gelir, (1) hangi günün hangi zamana girildiğini belirleyen dizeleri (2) biçimlendirme dizgilerini (3) ayrıştırırken; date_trunc veya extract için.

  • , dahili olarak, bir TIMESTAMP WITH veya WITHOUT TIME ZONE bir anlık temsil eder. Bir dize olarak saklanmaz. Zaman dilimi, yalnızca mağaza saatlerini kullanıcı girişinden ayrıştırdığınızda veya bir müşteriye gösterecek şekilde biçimlendirdiğinizde önemlidir. Hangi saat diliminde olursanız olun, aynı anda. Sadece "5 pm Doğu" veya "2pm Pasifik" yazılmıştır.

Bu bir shops.time_zone sütun ve (sizin tabloları denir ne olursa olsun ya da) bir shopper.time_zone sütun ihtiyaç gibi geliyor. Bu, bu zamanları kullanıcının bakış açısıyla doğru şekilde ayrıştırmanıza/biçimlendirmenize izin verecektir.

"saat kaçta kullanılabilir?" Hesaplamak için herhangi bir saat dilimi bilgisine ihtiyacınız yoktur.Bunun nedeni, NOW()'un bir an olması ve teklifin başlangıç ​​saatinin bir an olması ve hangi saat diliminde olursanız olun, aralarındaki fark her zaman 2 saattir (veya her neyse). Uygulamanız JSON veritabanındaki zaman damgalarını alıyorsa, büyük olasılıkla bunları dizeler olarak geçiriyorsunuz demektir. Eğer öyleyse, onları UTC'de geçirerek standart hale getirebilirim, böylece uygulama bunları kolayca yorumlayabilir ve "kaç saat kullanılabilir" gibi istemci tarafı hesaplamaları yapabilir.

İlgili konular