@@ -912,15 +912,16 @@ private void ChangeColumnType(PropertyChangeAction action)
912912 }
913913 else {
914914 var getValue = SqlDml . Case ( ) ;
915- getValue . Add ( SqlDml . IsNull ( tableRef [ tempName ] ) , GetDefaultValueExpression ( targetColumn ) ) ;
916-
917- if ( newSqlType . Type == SqlType . DateTimeOffset )
918- getValue . Add ( SqlDml . IsNotNull ( tableRef [ tempName ] ) , SqlDml . DateTimeToDateTimeOffset ( tableRef [ tempName ] ) ) ;
919- else if ( newSqlType . Type == SqlType . DateTime && providerInfo . Supports ( ProviderFeatures . DateTimeOffsetEmulation ) )
920- getValue . Add ( SqlDml . IsNotNull ( tableRef [ tempName ] ) , SqlDml . Cast ( SqlDml . Extract ( SqlDateTimeOffsetPart . DateTime , tableRef [ tempName ] ) , newSqlType ) ) ;
921- else
922- getValue . Add ( SqlDml . IsNotNull ( tableRef [ tempName ] ) , SqlDml . Cast ( tableRef [ tempName ] , newSqlType ) ) ;
915+ _ = getValue . Add ( SqlDml . IsNull ( tableRef [ tempName ] ) , GetDefaultValueExpression ( targetColumn ) ) ;
923916
917+ SqlExpression convertExpression ;
918+ if ( IsDateTimeType ( newSqlType . Type ) || IsDateTimeType ( column . DataType . Type ) ) {
919+ convertExpression = GetDataConversion ( column . DataType , newSqlType , tableRef [ tempName ] ) ;
920+ }
921+ else {
922+ convertExpression = SqlDml . Cast ( tableRef [ tempName ] , newSqlType ) ;
923+ }
924+ _ = getValue . Add ( SqlDml . IsNotNull ( tableRef [ tempName ] ) , convertExpression ) ;
924925 copyValues . Values [ tableRef [ originalName ] ] = getValue ;
925926 }
926927 upgradeOutput . BreakBatch ( ) ;
@@ -931,6 +932,66 @@ private void ChangeColumnType(PropertyChangeAction action)
931932 DropColumn ( table . TableColumns [ tempName ] , cleanupOutput ) ;
932933 }
933934
935+ private static SqlExpression GetDataConversion ( SqlValueType oldType , SqlValueType newType , SqlTableColumn sqlTableColumn )
936+ {
937+ var oldSqlType = oldType . Type ;
938+ var newSqlType = newType . Type ;
939+
940+ if ( oldSqlType == SqlType . DateTime && newSqlType == SqlType . DateTimeOffset ) {
941+ return SqlDml . DateTimeToDateTimeOffset ( sqlTableColumn ) ;
942+ }
943+ if ( oldSqlType == SqlType . DateTimeOffset && newSqlType == SqlType . DateTime ) {
944+ return SqlDml . DateTimeOffsetToDateTime ( sqlTableColumn ) ;
945+ }
946+ #if NET6_0_OR_GREATER //DO_DATEONLY
947+ if ( oldSqlType == SqlType . DateTime && newSqlType == SqlType . Date ) {
948+ return SqlDml . DateTimeToDate ( sqlTableColumn ) ;
949+ }
950+ if ( oldSqlType == SqlType . DateTime && newSqlType == SqlType . Time ) {
951+ return SqlDml . DateTimeToTime ( sqlTableColumn ) ;
952+ }
953+ if ( oldSqlType == SqlType . DateTimeOffset && newSqlType == SqlType . Date ) {
954+ return SqlDml . DateTimeOffsetToDate ( sqlTableColumn ) ;
955+ }
956+ if ( oldSqlType == SqlType . DateTimeOffset && newSqlType == SqlType . Time ) {
957+ return SqlDml . DateTimeOffsetToTime ( sqlTableColumn ) ;
958+ }
959+ if ( oldSqlType == SqlType . Date && newSqlType == SqlType . DateTime ) {
960+ return SqlDml . DateToDateTime ( sqlTableColumn ) ;
961+ }
962+ if ( oldSqlType == SqlType . Date && newSqlType == SqlType . DateTimeOffset ) {
963+ return SqlDml . DateToDateTimeOffset ( sqlTableColumn ) ;
964+ }
965+ if ( oldSqlType == SqlType . Time && newSqlType == SqlType . DateTime ) {
966+ return SqlDml . TimeToDateTime ( sqlTableColumn ) ;
967+ }
968+ if ( oldSqlType == SqlType . Time && newSqlType == SqlType . DateTimeOffset ) {
969+ return SqlDml . TimeToDateTimeOffset ( sqlTableColumn ) ;
970+ }
971+ //Date -> Time = invalid in most cases.
972+ //Time -> Date = invalid in most cases.
973+ //let storage throw exception on attempt
974+ #endif
975+
976+ return SqlDml . Cast ( sqlTableColumn , newType ) ;
977+ }
978+
979+ #if NET6_0_OR_GREATER //DO_DATEONLY
980+ private static bool IsDateTimeType ( in SqlType type )
981+ {
982+ return type == SqlType . DateTime
983+ || type == SqlType . DateTimeOffset
984+ || type == SqlType . Date
985+ || type == SqlType . Time ;
986+ }
987+ #else
988+ private static bool IsDateTimeType ( in SqlType type )
989+ {
990+ return type == SqlType . DateTime
991+ || type == SqlType . DateTimeOffset ;
992+ }
993+ #endif
994+
934995 private Table CreateTable ( TableInfo tableInfo )
935996 {
936997 var node = resolver . Resolve ( sqlModel , tableInfo . Name ) ;
0 commit comments