Skip to content

Commit 3e825c1

Browse files
committed
Oracle: Add DateConstruct/TimeConstruct functions support
Additionally, changed type mapping of Interval type from 'interval day to second' to 'inteval day(2) to second(6)' which are equivalents but the last one shows precisions explicitly
1 parent 647daed commit 3e825c1

4 files changed

Lines changed: 53 additions & 8 deletions

File tree

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2009-2023 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
55
// Created: 2009.07.17
66

@@ -41,6 +41,15 @@ public override void Visit(SqlFunctionCall node)
4141
case SqlFunctionType.DateTimeConstruct:
4242
DateTimeConstruct(node.Arguments[0], node.Arguments[1], node.Arguments[2]).AcceptVisitor(this);
4343
return;
44+
#if NET6_0_OR_GREATER //DO_DATEONLY
45+
case SqlFunctionType.DateConstruct:
46+
DateConstruct(node.Arguments[0], node.Arguments[1], node.Arguments[2]).AcceptVisitor(this);
47+
return;
48+
case SqlFunctionType.TimeConstruct: {
49+
TimeConstruct(node.Arguments[0], node.Arguments[1], node.Arguments[2], node.Arguments[3]).AcceptVisitor(this);
50+
return;
51+
}
52+
#endif
4453
case SqlFunctionType.IntervalAbs:
4554
SqlHelper.IntervalAbs(node.Arguments[0]).AcceptVisitor(this);
4655
return;
@@ -270,6 +279,22 @@ private static SqlExpression DateTimeConstruct(SqlExpression years, SqlExpressio
270279
AnsiString("YYYYMMDD"));
271280
}
272281

282+
#if NET6_0_OR_GREATER //DO_DATEONLY
283+
private static SqlExpression DateConstruct(SqlExpression years, SqlExpression months, SqlExpression days)
284+
{
285+
return SqlDml.FunctionCall("TO_DATE",
286+
SqlDml.FunctionCall("TO_CHAR", ((years * 100) + months) * 100 + days),
287+
AnsiString("YYYYMMDD"));
288+
}
289+
290+
private static SqlExpression TimeConstruct(SqlExpression hours, SqlExpression minutes, SqlExpression seconds, SqlExpression milliseconds)
291+
{
292+
return SqlDml.FunctionCall("NUMTODSINTERVAL",
293+
seconds + (minutes * 60) + (hours * 3600) + (milliseconds / 1000),
294+
AnsiString("second"));
295+
}
296+
#endif
297+
273298
private static SqlExpression DateTimeExtractDayOfWeek(SqlExpression dateTime)
274299
{
275300
// TO_CHAR with 'D' returns values depending on NLS_TERRITORY setting,

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/ServerInfoProvider.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,17 +228,16 @@ public override DataTypeCollection GetDataTypesInfo()
228228

229229
types.DateTime = DataTypeInfo.Range(SqlType.DateTime, common | index,
230230
ValueRange.DateTime, "timestamp");
231-
#if NET6_0_OR_GREATER
231+
#if NET6_0_OR_GREATER //DO_DATEONLY
232232
types.DateOnly = DataTypeInfo.Range(SqlType.Date, common | index,
233233
ValueRange.DateOnly, "DATE");
234234
types.TimeOnly = DataTypeInfo.Range(SqlType.Time, common | index,
235-
ValueRange.TimeOnly, "interval day(0) to second");
235+
ValueRange.TimeOnly, "interval day(0) to second(6)");
236236
#endif
237-
238237
types.DateTimeOffset = DataTypeInfo.Range(SqlType.DateTimeOffset, common | index,
239238
ValueRange.DateTimeOffset, "TIMESTAMP WITH TIME ZONE");
240239
types.Interval = DataTypeInfo.Range(SqlType.Interval, common | index,
241-
ValueRange.TimeSpan, "interval day to second");
240+
ValueRange.TimeSpan, "interval day(2) to second(6)");
242241

243242
types.Char = DataTypeInfo.Stream(SqlType.Char,
244243
common | index | DataTypeFeatures.ZeroLengthValueIsNull, 2000, "nchar");

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2022 Xtensive LLC.
1+
// Copyright (C) 2009-2023 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
@@ -33,6 +33,9 @@ internal class Translator : SqlTranslator
3333
#if NET6_0_OR_GREATER //DO_DATEONLY
3434
/// <inheritdoc/>
3535
public override string DateOnlyFormatString => @"'(DATE '\'yyyy\-MM\-dd\'\)";
36+
37+
/// <inheritdoc/>
38+
public override string TimeOnlyFormatString => @"'(INTERVAL '\'0 HH\:mm\:ss\.fffff\'\ DAY(0) TO SECOND(6))";
3639
#endif
3740

3841
/// <inheritdoc/>

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,24 @@ public override void BindDouble(DbParameter parameter, object value)
8888
nativeParameter.Value = value ?? DBNull.Value;
8989
}
9090

91+
#if NET6_0_OR_GREATER //DO_DATEONLY
92+
public override void BindDateOnly(DbParameter parameter, object value)
93+
{
94+
var nativeParameter = (OracleParameter) parameter;
95+
nativeParameter.OracleDbType = OracleDbType.Date;
96+
nativeParameter.Value = value == null
97+
? (object) DBNull.Value
98+
: new OracleDate(((DateOnly) value).ToDateTime(TimeOnly.MinValue));
99+
}
100+
101+
public override void BindTimeOnly(DbParameter parameter, object value)
102+
{
103+
var nativeParameter = (OracleParameter) parameter;
104+
nativeParameter.OracleDbType = OracleDbType.IntervalDS;
105+
nativeParameter.Value = value == null ? (object) DBNull.Value : new OracleIntervalDS(((TimeOnly) value).ToTimeSpan());
106+
}
107+
#endif
108+
91109
public override void BindDateTimeOffset(DbParameter parameter, object value)
92110
{
93111
var nativeParameter = (OracleParameter) parameter;

0 commit comments

Comments
 (0)