@@ -12,11 +12,16 @@ use super::{PgDate, PgTime, PgTimestamp};
12
12
use crate :: deserialize:: { self , FromSql } ;
13
13
use crate :: pg:: { Pg , PgValue } ;
14
14
use crate :: serialize:: { self , Output , ToSql } ;
15
- use crate :: sql_types:: { Date , Time , Timestamp , Timestamptz } ;
15
+ use crate :: sql_types:: { Date , Datetime , Time , Timestamp , Timestamptz } ;
16
16
17
17
// Postgres timestamps start from January 1st 2000.
18
18
const PG_EPOCH : PrimitiveDateTime = datetime ! ( 2000 -1 -1 0 : 00 : 00 ) ;
19
19
20
+ fn to_primitive_datetime ( dt : OffsetDateTime ) -> PrimitiveDateTime {
21
+ let dt = dt. to_offset ( UtcOffset :: UTC ) ;
22
+ PrimitiveDateTime :: new ( dt. date ( ) , dt. time ( ) )
23
+ }
24
+
20
25
#[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
21
26
impl FromSql < Timestamp , Pg > for PrimitiveDateTime {
22
27
fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
@@ -44,6 +49,38 @@ impl ToSql<Timestamp, Pg> for PrimitiveDateTime {
44
49
}
45
50
}
46
51
52
+ // Delegate offset datetimes in terms of UTC primitive datetimes; this stores everything in the DB as UTC
53
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
54
+ impl ToSql < Datetime , Pg > for OffsetDateTime {
55
+ fn to_sql < ' b > ( & ' b self , out : & mut Output < ' b , ' _ , Pg > ) -> serialize:: Result {
56
+ let prim = to_primitive_datetime ( * self ) ;
57
+ <PrimitiveDateTime as ToSql < Datetime , Pg > >:: to_sql ( & prim, & mut out. reborrow ( ) )
58
+ }
59
+ }
60
+
61
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
62
+ impl FromSql < Datetime , Pg > for OffsetDateTime {
63
+ fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
64
+ let prim = <PrimitiveDateTime as FromSql < Datetime , Pg > >:: from_sql ( bytes) ?;
65
+ Ok ( prim. assume_utc ( ) )
66
+ }
67
+ }
68
+
69
+ // delegate timestamp column to datetime column for offset datetimes
70
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
71
+ impl ToSql < Timestamp , Pg > for OffsetDateTime {
72
+ fn to_sql < ' b > ( & ' b self , out : & mut Output < ' b , ' _ , Pg > ) -> serialize:: Result {
73
+ <OffsetDateTime as ToSql < Datetime , Pg > >:: to_sql ( self , out)
74
+ }
75
+ }
76
+
77
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
78
+ impl FromSql < Timestamp , Pg > for OffsetDateTime {
79
+ fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
80
+ <OffsetDateTime as FromSql < Datetime , Pg > >:: from_sql ( bytes)
81
+ }
82
+ }
83
+
47
84
#[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
48
85
impl FromSql < Timestamptz , Pg > for PrimitiveDateTime {
49
86
fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
0 commit comments