Skip to content

Commit bc4859a

Browse files
authored
Manage time types with Microsoft SQL Server
1 parent 137f7bd commit bc4859a

File tree

2 files changed

+142
-1
lines changed

2 files changed

+142
-1
lines changed

src/main/java/org/stdg/ColumnValueFormatter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,20 @@ && isOracleSqlTimestamp(columnValue)) {
4141
|| columnValue instanceof Timestamp
4242
|| columnValue instanceof Time
4343
|| columnValue instanceof OffsetTime
44-
|| isTimestampWithTimeZoneH2Type(columnValue)) {
44+
|| isTimestampWithTimeZoneH2Type(columnValue)
45+
|| isMicrosoftDateTimeOffset(columnValue)) {
4546
String stringColumnValue = columnValue.toString();
4647
return "'" + stringColumnValue + "'";
4748
}
4849
return columnValue.toString();
4950
}
5051

52+
private boolean isMicrosoftDateTimeOffset(Object columnValue) {
53+
Class<?> columnValueClass = columnValue.getClass();
54+
String classCanonicalName = columnValueClass.getCanonicalName();
55+
return "microsoft.sql.DateTimeOffset".equals(classCanonicalName);
56+
}
57+
5158
private String buildOracleToDateFunctionFor(Timestamp timeStamp) {
5259
//https://stackoverflow.com/questions/9180014/using-oracle-to-date-function-for-date-string-with-milliseconds
5360
// "An Oracle DATE does not store times with more precision than a second."

src/test/java/org/stdg/test/MSSQLServerTest.java

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,138 @@ private int generateRandomPositiveInt() {
357357

358358
}
359359

360+
361+
@Test public void
362+
should_generate_an_insert_statement_with_a_date_type() {
363+
364+
// GIVEN
365+
TestTable playerTable =
366+
buildUniqueTable(DATA_SOURCE
367+
, "Table"
368+
, "date Date"
369+
)
370+
.create()
371+
.insertValues("'2012-09-17'");
372+
373+
// WHEN
374+
String playerTableName = playerTable.getTableName();
375+
String select = "SELECT * FROM " + playerTableName;
376+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
377+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
378+
379+
// THEN
380+
playerTable.recreate();
381+
SQL_EXECUTOR.execute(insertScript);
382+
assertThat(playerTable).withScript(insertScript)
383+
.hasNumberOfRows(1)
384+
.row(0).hasValues("2012-09-17");
385+
386+
}
387+
388+
@Test public void
389+
should_generate_an_insert_statement_with_a_timestamp_type() {
390+
// DATETIME2 is a timestamp type an accuracy of 100 nanoseconds
391+
TestTable playerTable =
392+
buildUniqueTable( DATA_SOURCE
393+
, "Table"
394+
, "timestampCol DATETIME2"
395+
)
396+
.create()
397+
.insertValues("'2012-09-17 19:56:47.32'");
398+
399+
// WHEN
400+
String playerTableName = playerTable.getTableName();
401+
String select = "SELECT * FROM " + playerTableName;
402+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
403+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
404+
405+
// THEN
406+
playerTable.recreate();
407+
SQL_EXECUTOR.execute(insertScript);
408+
assertThat(playerTable).withScript(insertScript)
409+
.hasNumberOfRows(1);
410+
Assertions.assertThat(insertScript).contains("'2012-09-17 19:56:47.32'");
411+
}
412+
413+
@Test public void
414+
should_generate_an_insert_statement_with_a_small_datetime_type() {
415+
// SMALLDATETIME is a timestamp type an accuracy of 1 minute
416+
TestTable playerTable =
417+
buildUniqueTable( DATA_SOURCE
418+
, "Table"
419+
, "timestampCol SMALLDATETIME"
420+
)
421+
.create()
422+
.insertValues("'2012-09-17 19:56:47.32'");
423+
424+
// WHEN
425+
String playerTableName = playerTable.getTableName();
426+
String select = "SELECT * FROM " + playerTableName;
427+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
428+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
429+
430+
// THEN
431+
playerTable.recreate();
432+
SQL_EXECUTOR.execute(insertScript);
433+
assertThat(playerTable).withScript(insertScript)
434+
.hasNumberOfRows(1);
435+
Assertions.assertThat(insertScript).contains("'2012-09-17 19:57:00.0'");
436+
}
437+
438+
439+
@Test public void
440+
should_generate_an_insert_statement_with_a_timestamp_with_time_zone_type() {
441+
442+
// GIVEN
443+
TestTable playerTable =
444+
buildUniqueTable(DATA_SOURCE
445+
, "Table"
446+
, "col DATETIMEOFFSET"
447+
)
448+
.create()
449+
.insertValues("'2020-12-20 17:20:13 +03:00'");
450+
451+
// WHEN
452+
String playerTableName = playerTable.getTableName();
453+
String select = "SELECT * FROM " + playerTableName;
454+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
455+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
456+
457+
// THEN
458+
459+
playerTable.recreate();
460+
SQL_EXECUTOR.execute(insertScript);
461+
assertThat(playerTable).withScript(insertScript)
462+
.hasNumberOfRows(1);
463+
Assertions.assertThat(insertScript).contains("'2020-12-20 17:20:13 +03:00'");
464+
}
465+
466+
467+
@Test public void
468+
should_generate_an_insert_statement_with_a_time_type() {
469+
470+
// GIVEN
471+
TestTable playerTable =
472+
buildUniqueTable( DATA_SOURCE
473+
, "Table"
474+
, "col TIME"
475+
)
476+
.create()
477+
.insertValues("'23:59:59'");
478+
479+
// WHEN
480+
String playerTableName = playerTable.getTableName();
481+
String select = "SELECT * FROM " + playerTableName;
482+
SqlTestDataGenerator sqlTestDataGenerator = SqlTestDataGenerator.buildFrom(DATA_SOURCE);
483+
String insertScript = sqlTestDataGenerator.generateInsertScriptFor(select);
484+
485+
// THEN
486+
playerTable.recreate();
487+
SQL_EXECUTOR.execute(insertScript);
488+
assertThat(playerTable).withScript(insertScript)
489+
.hasNumberOfRows(1)
490+
.row(0).hasValues("23:59:59");
491+
492+
}
493+
360494
}

0 commit comments

Comments
 (0)