1- using System ;
21using DuckDB . NET . Data ;
2+ using DuckDB . NET . Native ;
33using FluentAssertions ;
4+ using System ;
45using Xunit ;
56
67namespace DuckDB . NET . Test . Parameters ;
@@ -79,9 +80,28 @@ public void InsertAndQueryTest(int year, int mon, int day, byte hour, byte minut
7980 {
8081 var expectedValue = new DateTime ( year , mon , day , hour , minute , second ) . AddTicks ( microsecond * 10 ) ;
8182
82- Command . CommandText = "CREATE TABLE TimestampTestTable (a INTEGER, b TIMESTAMP);" ;
83- Command . ExecuteNonQuery ( ) ;
83+ TestTimestampInsert ( "TIMESTAMP" , DuckDBType . Timestamp , expectedValue ) ;
84+
85+ TestTimestampInsert ( "TIMESTAMP_S" , DuckDBType . TimestampS , expectedValue ) ;
86+
87+ TestTimestampInsert ( "TIMESTAMP_MS" , DuckDBType . TimestampMs , expectedValue ) ;
88+
89+ TestTimestampInsert ( "TIMESTAMP_NS" , DuckDBType . TimestampNs , expectedValue ) ;
90+ }
8491
92+ private void TestTimestampInsert ( string timestampType , DuckDBType duckDBType , DateTime expectedValue )
93+ {
94+ expectedValue = duckDBType switch
95+ {
96+ DuckDBType . TimestampS => Trim ( expectedValue , TimeSpan . TicksPerSecond ) ,
97+ DuckDBType . TimestampMs => Trim ( expectedValue , TimeSpan . TicksPerMillisecond ) ,
98+ DuckDBType . TimestampNs => Trim ( expectedValue , TimeSpan . FromTicks ( 100 ) . Ticks ) ,
99+ _ => expectedValue
100+ } ;
101+
102+ Command . CommandText = $ "CREATE OR Replace TABLE TimestampTestTable (a INTEGER, b { timestampType } );";
103+ Command . ExecuteNonQuery ( ) ;
104+
85105 Command . CommandText = "INSERT INTO TimestampTestTable (a, b) VALUES (42, ?);" ;
86106 Command . Parameters . Add ( new DuckDBParameter ( expectedValue ) ) ;
87107 Command . ExecuteNonQuery ( ) ;
@@ -94,32 +114,37 @@ public void InsertAndQueryTest(int year, int mon, int day, byte hour, byte minut
94114
95115 reader . GetFieldType ( 1 ) . Should ( ) . Be ( typeof ( DateTime ) ) ;
96116
97- var dateTime = reader . GetDateTime ( 1 ) ;
117+ var databaseValue = reader . GetDateTime ( 1 ) ;
98118
99- dateTime . Year . Should ( ) . Be ( year ) ;
100- dateTime . Month . Should ( ) . Be ( mon ) ;
101- dateTime . Day . Should ( ) . Be ( day ) ;
102- dateTime . Hour . Should ( ) . Be ( hour ) ;
103- dateTime . Minute . Should ( ) . Be ( minute ) ;
104- dateTime . Second . Should ( ) . Be ( second ) ;
105- dateTime . Millisecond . Should ( ) . Be ( microsecond / 1000 ) ;
119+ databaseValue . Year . Should ( ) . Be ( expectedValue . Year ) ;
120+ databaseValue . Month . Should ( ) . Be ( expectedValue . Month ) ;
121+ databaseValue . Day . Should ( ) . Be ( expectedValue . Day ) ;
122+ databaseValue . Hour . Should ( ) . Be ( expectedValue . Hour ) ;
123+ databaseValue . Minute . Should ( ) . Be ( expectedValue . Minute ) ;
124+ databaseValue . Second . Should ( ) . Be ( expectedValue . Second ) ;
106125
107- dateTime . TimeOfDay . Should ( ) . Be ( expectedValue . TimeOfDay ) ;
126+ databaseValue . Millisecond . Should ( ) . Be ( expectedValue . Millisecond ) ;
127+ databaseValue . Microsecond . Should ( ) . Be ( expectedValue . Microsecond ) ;
128+ databaseValue . Nanosecond . Should ( ) . Be ( expectedValue . Nanosecond ) ;
129+
130+ databaseValue . TimeOfDay . Should ( ) . Be ( expectedValue . TimeOfDay ) ;
108131
109132 var dateTimeNullable = reader . GetFieldValue < DateTime ? > ( 1 ) ;
110- dateTime = dateTimeNullable . Value ;
133+ databaseValue = dateTimeNullable . Value ;
111134
112- dateTime . Year . Should ( ) . Be ( year ) ;
113- dateTime . Month . Should ( ) . Be ( mon ) ;
114- dateTime . Day . Should ( ) . Be ( day ) ;
115- dateTime . Hour . Should ( ) . Be ( hour ) ;
116- dateTime . Minute . Should ( ) . Be ( minute ) ;
117- dateTime . Second . Should ( ) . Be ( second ) ;
118- dateTime . Millisecond . Should ( ) . Be ( microsecond / 1000 ) ;
135+ databaseValue . Year . Should ( ) . Be ( expectedValue . Year ) ;
136+ databaseValue . Month . Should ( ) . Be ( expectedValue . Month ) ;
137+ databaseValue . Day . Should ( ) . Be ( expectedValue . Day ) ;
138+ databaseValue . Hour . Should ( ) . Be ( expectedValue . Hour ) ;
139+ databaseValue . Minute . Should ( ) . Be ( expectedValue . Minute ) ;
140+ databaseValue . Second . Should ( ) . Be ( expectedValue . Second ) ;
119141
120- dateTime . TimeOfDay . Should ( ) . Be ( expectedValue . TimeOfDay ) ;
142+ databaseValue . Millisecond . Should ( ) . Be ( expectedValue . Millisecond ) ;
143+ databaseValue . Microsecond . Should ( ) . Be ( expectedValue . Microsecond ) ;
144+ databaseValue . Nanosecond . Should ( ) . Be ( expectedValue . Nanosecond ) ;
121145
122- Command . CommandText = "DROP TABLE TimestampTestTable;" ;
123- Command . ExecuteNonQuery ( ) ;
146+ databaseValue . TimeOfDay . Should ( ) . Be ( expectedValue . TimeOfDay ) ;
124147 }
148+
149+ public static DateTime Trim ( DateTime date , long ticks ) => new ( date . Ticks - ( date . Ticks % ticks ) , date . Kind ) ;
125150}
0 commit comments