标量

Java API 标量接口为 Scalar,继承自 Entity 接口。

创建标量,就是将 Java 原生类型转换为 DolphinDB 中类型。一个标量就是一个单独的数据。

本节将介绍标量的创建、读取和更新方式及使用示例。

VOID

// VOID 类型不支持通过构造方法直接创建,一般由脚本运行返回
DBConnection conn = new DBConnection();
conn.connect("192.168.0.69", 8802, "admin", "123456");
Void voidValue = (Void) conn.run("NULL");
// 读取数据
voidValue.getString(); // ""
// 判空/设置为空
voidValue.isNull();    // true
// 获取数据类型/数据形式
voidValue.getDataType(); // DT_VOID;
voidValue.getDataCategory(); // NOTHING;

LOGICAL

BOOL

// 创建 boolean 类型标量
BasicBoolean basicBoolean = new BasicBoolean(true);

// 读取数据
basicBoolean.getString();    // "true"
basicBoolean.getBoolean();   // true

// 判空/设置为空
basicBoolean.isNull();       // false
basicBoolean.setNull();      // BasicBoolean 空值底层用 Byte.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicBoolean.getDataType();     // DT_BOOL
basicBoolean.getDataCategory(); // LOGICAL

INTEGRAL

CHAR

// 创建 char 类型标量
BasicByte basicByte = new BasicByte((byte) 'a');
// 读取数据
basicByte.getString(); // 'a'
basicByte.getByte();    // 97
// 判空/设置为空
basicByte.isNull();    // false
basicByte.setNull();     // BasicByte 空值底层用 Byte.MIN_VALUE 来表示
// 获取数据类型/数据形式
basicByte.getDataType(); // DT_BYTE;
basicByte.getDataCategory(); // INTEGRAL;

SHORT

// 创建 short 类型标量
BasicShort basicShort = new BasicShort((short) 21);
// 读取数据
basicShort.getString(); // 21
basicShort.getShort();    // 21
// 判空/设置为空
basicShort.isNull();    // false
basicShort.setNull();     // BasicShort 空值底层用 Short.MIN_VALUE 来表示
// 获取数据类型/数据形式
basicShort.getDataType(); // DT_SHORT;
basicShort.getDataCategory(); // INTEGRAL;

INT

// 创建 int 类型标量
BasicInt basicInt = new BasicInt(21);
// 读取数据
basicInt.getString(); // "21"
basicInt.getInt();    // 21
// 判空/设置为空
basicInt.isNull();    // false
basicInt.setNull();     // BasicInt 空值底层用 Integer.MIN_VALUE 来表示
// 获取数据类型/数据形式
basicInt.getDataType(); // DT_INT;
basicInt.getDataCategory(); // INTEGRAL;

LONG

// 创建 long 类型标量
BasicLong basicLong = new BasicLong(21L);
// 读取数据
basicLong.getString(); // "21"
basicLong.getLong();    // 21
// 判空/设置为空
basicLong.isNull();    // false
basicLong.setNull();     // BasicLong 空值底层用 Long.MIN_VALUE 来表示
// 获取数据类型/数据形式
basicLong.getDataType(); // DT_LONG;
basicLong.getDataCategory(); // INTEGRAL;

TEMPORAL

DATE

// 1)使用 LocalDate 创建 DATE 类型标量
BasicDate basicDate = new BasicDate(LocalDate.of(2023, 12, 25));
// 2)使用 Calendar 创建 date 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(2023, Calendar.DECEMBER, 25);
BasicDate basicDate = new BasicDate(calendar);

// 读取数据
basicDate.getString();    // "2023.12.25"
basicDate.getDate();      // LocalDate对象: 2023-12-25

// 判空/设置为空
basicDate.isNull();       // false
basicDate.setNull();      // BasicDate 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicDate.getDataType();     // DT_DATE
basicDate.getDataCategory(); // TEMPORAL

MONTH

// 1)使用 Month 创建 MONTH 类型标量
BasicMonth basicMonth = new BasicMonth(2023, Month.DECEMBER);
// 2)使用 YearMonth 创建 MONTH 类型标量
BasicMonth basicMonth = new BasicMonth(YearMonth.of(2023, 12));
// 3)使用 Calendar 创建 MONTH 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(2023, Calendar.DECEMBER, 1);
BasicMonth basicMonth = new BasicMonth(calendar);

// 读取数据
basicMonth.getString();    // "2023.12M"
basicMonth.getMonth();     // YearMonth对象: 2023-12

// 判空/设置为空
basicMonth.isNull();       // false
basicMonth.setNull();      // BasicMonth 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicMonth.getDataType();     // DT_MONTH
basicMonth.getDataCategory(); // TEMPORAL

TIME

// 1)使用 LocalTime 创建 TIME 类型标量
BasicTime basicTime = new BasicTime(LocalTime.of(14, 30, 45, 123000000));
// 2)使用 Calendar 创建 TIME 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 14);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 45);
calendar.set(Calendar.MILLISECOND, 123);
BasicTime basicTime = new BasicTime(calendar);

// 读取数据
basicTime.getString();    // "14:30:45.123"
basicTime.getTime();      // LocalTime对象: 14:30:45.123

// 判空/设置为空
basicTime.isNull();       // false
basicTime.setNull();      // BasicTime 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicTime.getDataType();     // DT_TIME
basicTime.getDataCategory(); // TEMPORAL

MINUTE

// 1)使用 LocalTime 创建 MINUTE 类型标量
BasicMinute basicMinute = new BasicMinute(LocalTime.of(14, 30));
// 2)使用 Calendar 创建 MINUTE 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 14);
calendar.set(Calendar.MINUTE, 30);
BasicMinute basicMinute = new BasicMinute(calendar);

// 读取数据
basicMinute.getString();    // "14:30m"
basicMinute.getMinute();    // LocalTime对象: 14:30

// 判空/设置为空
basicMinute.isNull();       // false
basicMinute.setNull();      // BasicMinute 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicMinute.getDataType();     // DT_MINUTE
basicMinute.getDataCategory(); // TEMPORAL

SECOND

// 1)使用 LocalTime 创建 SECOND 类型标量
BasicSecond basicSecond = new BasicSecond(LocalTime.of(14, 30, 45));
// 2)使用 Calendar 创建 SECOND 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 14);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 45);
BasicSecond basicSecond = new BasicSecond(calendar);

// 读取数据
basicSecond.getString();    // "14:30:45"
basicSecond.getSecond();    // LocalTime对象: 14:30:45

// 判空/设置为空
basicSecond.isNull();       // false
basicSecond.setNull();      // BasicSecond 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicSecond.getDataType();     // DT_SECOND
basicSecond.getDataCategory(); // TEMPORAL

DATETIME

// 1)使用 LocalDateTime 创建 DATETIME 类型标量
BasicDateTime basicDateTime = new BasicDateTime(LocalDateTime.of(2023, 12, 25, 14, 30, 45));
// 2)使用 Calendar 创建 DATETIME 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(2023, Calendar.DECEMBER, 25, 14, 30, 45);
BasicDateTime basicDateTime = new BasicDateTime(calendar);

// 读取数据
basicDateTime.getString();    // "2023.12.25T14:30:45"
basicDateTime.getDateTime();  // LocalDateTime对象: 2023-12-25T14:30:45

// 判空/设置为空
basicDateTime.isNull();       // false
basicDateTime.setNull();      // BasicDateTime 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicDateTime.getDataType();     // DT_DATETIME
basicDateTime.getDataCategory(); // TEMPORAL

TIMESTAMP

// 1)使用 LocalDateTime 创建 TIMESTAMP 类型标量
BasicTimestamp basicTimestamp = new BasicTimestamp(LocalDateTime.of(2023, 12, 25, 14, 30, 45, 123000000));
// 2)使用 Calendar 创建 TIMESTAMP 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(2023, Calendar.DECEMBER, 25, 14, 30, 45);
calendar.set(Calendar.MILLISECOND, 123);
BasicTimestamp basicTimestamp = new BasicTimestamp(calendar);

// 读取数据
basicTimestamp.getString();      // "2023.12.25T14:30:45.123"
basicTimestamp.getTimestamp();   // LocalDateTime对象: 2023-12-25T14:30:45.123

// 判空/设置为空
basicTimestamp.isNull();         // false
basicTimestamp.setNull();        // BasicTimestamp 空值底层用 Long.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicTimestamp.getDataType();     // DT_TIMESTAMP
basicTimestamp.getDataCategory(); // TEMPORAL

NANOTIME

// 1)使用 LocalTime 创建 NANOTIME 类型标量
BasicNanoTime basicNanoTime = new BasicNanoTime(LocalTime.of(14, 30, 45, 123456789));
// 2)使用 LocalDateTime 创建 NANOTIME 类型标量
BasicNanoTime basicNanoTimeFromDateTime = new BasicNanoTime(LocalDateTime.of(2023, 12, 25, 14, 30, 45, 123456789));

// 读取数据
basicNanoTime.getString();      // "14:30:45.123456789"
basicNanoTime.getNanoTime();    // LocalTime对象: 14:30:45.123456789

// 判空/设置为空
basicNanoTime.isNull();         // false
basicNanoTime.setNull();        // BasicNanoTime 空值底层用 Long.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicNanoTime.getDataType();     // DT_NANOTIME
basicNanoTime.getDataCategory(); // TEMPORAL

NANOTIMESTAMP

// 使用 LocalDateTime 创建 NANOTIMESTAMP 类型标量
BasicNanoTimestamp basicNanoTimestamp = new BasicNanoTimestamp(LocalDateTime.of(2023, 12, 25, 14, 30, 45, 123456789));

// 读取数据
basicNanoTimestamp.getString();         // "2023.12.25T14:30:45.123456789"
basicNanoTimestamp.getNanoTimestamp();  // LocalDateTime对象: 2023-12-25T14:30:45.123456789

// 判空/设置为空
basicNanoTimestamp.isNull();            // false
basicNanoTimestamp.setNull();           // BasicNanoTimestamp 空值底层用 Long.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicNanoTimestamp.getDataType();       // DT_NANOTIMESTAMP
basicNanoTimestamp.getDataCategory();   // TEMPORAL

DATEHOUR

// 1)使用 LocalDateTime 创建 DATEHOUR 类型标量
BasicDateHour basicDateHour = new BasicDateHour(LocalDateTime.of(2023, 12, 25, 14, 0, 0));

// 2)使用 Calendar 创建 DATEHOUR 类型标量
Calendar calendar = Calendar.getInstance();
calendar.set(2023, Calendar.DECEMBER, 25, 14, 0, 0);
BasicDateHour basicDateHourFromCalendar = new BasicDateHour(calendar);

// 读取数据
basicDateHour.getString();      // "2023.12.25T14"
basicDateHour.getDateHour();    // LocalDateTime对象: 2023-12-25T14:00
basicDateHour.getInt();         // 小时数: 548774

// 判空/设置为空
basicDateHour.isNull();         // false
basicDateHour.setNull();        // BasicDateHour 空值底层用 Integer.MIN_VALUE 来表示

// 获取数据类型/数据形式
basicDateHour.getDataType();     // DT_DATEHOUR
basicDateHour.getDataCategory(); // TEMPORAL

FLOATING

FLOAT

// 创建 float 类型标量
BasicFloat basicFloat = new BasicFloat(3.14159f);

// 读取数据
basicFloat.getString();     // "3.14159"
basicFloat.getFloat();      // 3.14159f

// 判空/设置为空
basicFloat.isNull();        // false
basicFloat.setNull();       // BasicFloat 空值底层用 -Float.MAX_VALUE 来表示

// 获取数据类型/数据形式
basicFloat.getDataType();     // DT_FLOAT
basicFloat.getDataCategory(); // FLOATING

DOUBLE

// 创建 double 类型标量
BasicDouble basicDouble = new BasicDouble(3.141592653589793);

// 读取数据
basicDouble.getString();     // "3.14159265"
basicDouble.getDouble();     // 3.141592653589793

// 判空/设置为空
basicDouble.isNull();        // false
basicDouble.setNull();       // BasicDouble 空值底层用 -Double.MAX_VALUE 来表示

// 获取数据类型/数据形式
basicDouble.getDataType();     // DT_DOUBLE
basicDouble.getDataCategory(); // FLOATING

LITERAL

STRING

// 创建 string 类型标量
BasicString basicString = new BasicString("Hello World");

// 读取数据
basicString.getString();     // "Hello World"

// 判空/设置为空
basicString.isNull();        // false
basicString.setNull();       // BasicString 空值底层用空字符串 "" 来表示

// 获取数据类型/数据形式
basicString.getDataType();     // DT_STRING
basicString.getDataCategory(); // LITERAL

SYMBOL

不支持创建 SYMBOL 类型标量。

BLOB

// 创建 blob 类型标量
BasicString basicBlob = new BasicString("Hello World", true);

// 读取数据
basicBlob.getString();       // "Hello World"
basicBlob.getBytes();        // byte数组: [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

// 判空/设置为空
basicBlob.isNull();          // false
basicBlob.setNull();         // BasicString(BLOB) 空值底层用空字节数组 new byte[0] 来表示

// 获取数据类型/数据形式
basicBlob.getDataType();     // DT_BLOB
basicBlob.getDataCategory(); // LITERAL

BINARY

INT128

// 创建 int128 类型标量
BasicInt128 basicInt128 = new BasicInt128(15645L, 564353L);

// 读取数据
basicInt128.getString(); // "0000000000003d1d0000000000089c81"

// 判空/设置为空
basicInt128.isNull();                   // false
basicInt128.setNull();                  // BasicInt128 空值底层用 Long2 的空值来表示: high、low 分别为0

// 获取数据类型/数据形式
basicInt128.getDataType();              // DT_INT128
basicInt128.getDataCategory();          // BINARY

UUID

// 创建 uuid 类型标量
BasicUuid basicUuid = new BasicUuid(321324L, 32433L);

// 读取数据
basicUuid.getString(); // "00000000-0004-e72c-0000-000000007eb1"

// 判空/设置为空
basicUuid.isNull();                  // false
basicUuid.setNull();                 // BasicUuid 空值底层用 Long2 的空值来表示 (high=0, low=0)

// 获取数据类型/数据形式
basicUuid.getDataType();             // DT_UUID
basicUuid.getDataCategory();         // BINARY

// 从字符串创建/随机生成
BasicUuid.fromString("550e8400-e29b-41d4-a716-446655440000"); // 从UUID字符串创建
BasicUuid.random();                  // 生成随机UUID

IPADDR

// 创建 IP 地址类型标量
BasicIPAddr basicIPAddr = new BasicIPAddr(0, 3232235953L);
// 从字符串创建
BasicIPAddr.fromString("192.168.1.1");              // 从IPv4字符串创建
BasicIPAddr.fromString("2001:0db8:85a3::8a2e:370:7334"); // 从IPv6字符串创建

// 读取数据
System.out.println(basicIPAddr.getString(); // "192.168.1.177"

// 判空/设置为空
basicIPAddr.isNull();                  // false
basicIPAddr.setNull();                 // BasicIPAddr 空值底层用 Long2 的空值来表示 (high=0, low=0)

// 获取数据类型/数据形式
basicIPAddr.getDataType();             // DT_IPADDR
basicIPAddr.getDataCategory();         // BINARY

POINT

// 创建点类型标量
BasicPoint basicPoint = new BasicPoint(3.14, 2.71);
// 读取数据
basicPoint.getString(); // "(3.14, 2.71)"
basicPoint.getX();               // 3.14 (x坐标)
basicPoint.getY();               // 2.71 (y坐标)

// 判空/设置为空
basicPoint.isNull();             // false
basicPoint.setNull();            // 设置为空值,getString()返回"(,)"

// 获取数据类型/数据形式
basicPoint.getDataType();        // DT_POINT
basicPoint.getDataCategory();    // BINARY

DECIMAL

DECIMAL32

// 创建 Decimal32 类型标量
BasicDecimal32 basicDecimal32 = new BasicDecimal32("123.45", 2);

// 读取数据
basicDecimal32.getString();          // "123.45"
basicDecimal32.getScale();           // 2 (小数位数)

// 判空/设置为空
basicDecimal32.isNull();             // false
basicDecimal32.setNull();            // 设置为空值,getString()返回""

// 获取数据类型/数据形式
basicDecimal32.getDataType();        // DT_DECIMAL32
basicDecimal32.getDataCategory();    // DENARY

DECIMAL64

BasicDecimal64 basicDecimal64 = new BasicDecimal64("123456.789", 3);
// 读取数据
basicDecimal64.getString();          // "123456.789"
basicDecimal64.getScale();           // 3 (小数位数)

// 判空/设置为空
basicDecimal64.isNull();             // false
basicDecimal64.setNull();            // 设置为空值,getString()返回""

// 获取数据类型/数据形式
basicDecimal64.getDataType();        // DT_DECIMAL64
basicDecimal64.getDataCategory();    // DENARY

DECIMAL128

BasicDecimal128 basicDecimal128 = new BasicDecimal128("12345678901234567890.123456", 6);
// 读取数据
basicDecimal128.getString();         // "12345678901234567890.123456"
basicDecimal128.getScale();          // 6 (小数位数)

// 判空/设置为空
basicDecimal128.isNull();            // false
basicDecimal128.setNull();           // 设置为空值,getString()返回""

// 获取数据类型/数据形式
basicDecimal128.getDataType();       // DT_DECIMAL128
basicDecimal128.getDataCategory();   // DENARY

OTHER

COMPLEX

// 创建复数类型标量
BasicComplex basicComplex = new BasicComplex(3.14, -2.71);
// 读取数据
basicComplex.getString();           // "3.14-2.71i"
basicComplex.getReal();             // 3.14 (实部)
basicComplex.getImage();            // -2.71 (虚部)
// 判空/设置为空
basicComplex.isNull();              // false
basicComplex.setNull();             // 设置为空值,getString()返回""
// 获取数据类型/数据形式
basicComplex.getDataType();         // DT_COMPLEX
basicComplex.getDataCategory();     // BINARY

SYSTEM

DURATION

// 使用 Entity.DURATION 创建持续时间类型标量
BasicDuration basicDuration = new BasicDuration(Entity.DURATION.SECOND, 3600);
// 或者使用字符串表示单位
BasicDuration basicDuration = new BasicDuration("s", 3600);

// 读取数据
basicDuration.getString();           // "3600s"
basicDuration.getDuration();         // 3600
basicDuration.getUnit();             // DURATION.SECOND
basicDuration.getExchangeInt();      // 3
basicDuration.getExchangeName();     // "s"

// 判空/设置为空
basicDuration.isNull();              // false
basicDuration.setNull();             // 设置为空值,getString()返回""
// 获取数据类型/数据形式
basicDuration.getDataType();         // DT_DURATION
basicDuration.getDataCategory();     // SYSTEM