Как перевести string в int sql
Когда мы присваиваем значение одного типа столбцу, который хранит данные другого типа, либо выполняем операции, которые вовлекают данные разных типов, SQL Server пытается выполнить преобразование и привести используемое значение к нужному типу. Но не все преобразования SQL Server может выполнить автоматически. SQL Server может выполнять неявные преобразования от типа с меньшим приоритетом к типу с большим приоритетом. Таблица приоритетов (чем выше, тем больший приоритет):
datetime |
smalldatetime |
float |
real |
decimal |
money |
smallmoney |
int |
smallint |
tinyint |
bit |
nvarchar |
nchar |
varchar |
char |
То есть SQL Server автоматически может преобразовать число 100.0 (float) в дату и время (datetime).
В тех случаях, когда необходимо выполнить преобразования от типов с высшим приоритетом к типам с низшим приоритетом, то надо выполнять явное приведение типов. Для этого в T-SQL определены две функции: CONVERT и CAST .
Функция CAST преобразует выражение одного типа к другому. Она имеет следующую форму:
CAST(выражение AS тип_данных)
Для примера возьмем следующие таблицы:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Например, при выводе информации о заказах преобразует числовое значение и дату в строку:
SELECT Id, CAST(CreatedAt AS nvarchar) + '; total: ' + CAST(Price * ProductCount AS nvarchar) FROM Orders
Convert
Большую часть преобразований охватывает функция CAST. Если же необходимо какое-то дополнительное форматирование, то можно использовать функцию CONVERT . Она имеет следующую форму:
CONVERT(тип_данных, выражение [, стиль])
Третий необязательный параметр задает стиль форматирования данных. Этот параметр представляет числовое значение, которое для разных типов данных имеет разную интерпретацию. Например, некоторые значения для форматирования дат и времени:
- 0 или 100 — формат даты «Mon dd yyyy hh:miAM/PM» (значение по умолчанию)
- 1 или 101 — формат даты «mm/dd/yyyy»
- 3 или 103 — формат даты «dd/mm/yyyy»
- 7 или 107 — формат даты «Mon dd, yyyy hh:miAM/PM»
- 8 или 108 — формат даты «hh:mi:ss»
- 10 или 110 — формат даты «mm-dd-yyyy»
- 14 или 114 — формат даты «hh:mi:ss:mmmm» (24-часовой формат времени)
Некоторые значения для форматирования данных типа money в строку:
- 0 — в дробной части числа остаются только две цифры (по умолчанию)
- 1 — в дробной части числа остаются только две цифры, а для разделения разрядов применяется запятая
- 2 — в дробной части числа остаются только четыре цифры
Например, выведем дату и стоимость заказов с форматированием:
SELECT CONVERT(nvarchar, CreatedAt, 3), CONVERT(nvarchar, Price * ProductCount, 1) FROM Orders
TRY_CONVERT
При использовании функций CAST и CONVERT SQL Server выбрасывает исключение, если данные нельзя привести к определенному типу. Например:
SELECT CONVERT(int, 'sql')
Чтобы избежать генерации исключения можно использовать функцию TRY_CONVERT . Ее использование аналогично функции CONVERT за тем исключением, что если выражение не удается преобразовать к нужному типу, то функция возвращает NULL:
SELECT TRY_CONVERT(int, 'sql') -- NULL SELECT TRY_CONVERT(int, '22') -- 22
Дополнительные функции
Кроме CAST, CONVERT, TRY_CONVERT есть еще ряд функций, которые могут использоваться для преобразования в ряд типов:
- STR(float [, length [,decimal]]) : преобразует число в строку. Второй параметр указывает на длину строки, а третий — сколько знаков в дробной части числа надо оставлять
- CHAR(int) : преобразует числовой код ASCII в символ. Нередко используется для тех ситуаций, когда необходим символ, который нельзя ввести с клавиатуры
- ASCII(char) : преобразует символ в числовой код ASCII
- NCHAR(int) : преобразует числовой код UNICODE в символ
- UNICODE(char) : преобразует символ в числовой код UNICODE
SELECT STR(123.4567, 6,2) -- 123.46 SELECT CHAR(219) -- Ы SELECT ASCII('Ы') -- 219 SELECT NCHAR(1067) -- Ы SELECT UNICODE('Ы') -- 1067
Перевод строки в число
Добрый день . Подскажите пожалуйста . У меня задается значение времени в виде строки . Мне нужно перевести эту строку в число . Например есть время 12:12 ,то есть перевести их в числа . Функцию substring я использую как выделение самих чисел в строке , а как их преобразовать к числу ?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Убрать перевод строки
Добрый день, подскажите пожалуйста. искал на просторах интернета решения моей давней задачи.
Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой.
Перевод из строки в число
Каким способом можно перевести строчку типа "System::String ^" в тип double?
Перевод строки в число
Допустим есть строка string на конце которой есть цифра. Если я пытаюсь присвоить этот символ.
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
Ну если вам необходимо преобразовать в чисто то
CAST('12' AS INT)
А если всё же вы пытаетесь вставить в колонку типа дата значение даты то достаточно вставлять в строковом формате вида: ‘YYYYMMDD’ те.
UPDATE TABLE__ SET DATE_NOW = '20120216'
Функции преобразования типов
При преобразовании значения из одного типа в другой необходимо помнить, что в общем случае это небезопасная операция, которая может привести к потере данных. Потеря данных может произойти при попытке сконвертировать тип данных значения от большего к меньшему или при конвертировании между различными классами типов данных.
Поведение ClickHouse при конвертировании похоже на поведение C++ программ.
toInt(8 | 16 | 32 | 64 | 128 | 256)
Преобразует входное значение к типу Int. Семейство функций включает:
- toInt8(expr) — возвращает значение типа Int8 .
- toInt16(expr) — возвращает значение типа Int16 .
- toInt32(expr) — возвращает значение типа Int32 .
- toInt64(expr) — возвращает значение типа Int64 .
- toInt128(expr) — возвращает значение типа Int128 .
- toInt256(expr) — возвращает значение типа Int256 .
Аргументы
- expr — выражение возвращающее число или строку с десятичным представление числа. Бинарное, восьмеричное и шестнадцатеричное представление числа не поддержаны. Ведущие нули обрезаются.
Возвращаемое значение
Целое число типа Int8 , Int16 , Int32 , Int64 , Int128 или Int256 .
Функции используют округление к нулю, т.е. обрезают дробную часть числа.
Поведение функций для аргументов NaN и Inf не определено. При использовании функций помните о возможных проблемах при преобразовании чисел.
Пример
SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8);
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐ │ -9223372036854775808 │ 32 │ 16 │ 8 │ └──────────────────────┴─────────────┴───────────────┴─────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrZero
Принимает аргумент типа String и пытается его распарсить в Int(8 | 16 | 32 | 64 | 128 | 256). Если не удалось — возвращает 0.
Пример
SELECT toInt64OrZero('123123'), toInt8OrZero('123qwe123');
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐ │ 123123 │ 0 │ └─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrNull
Принимает аргумент типа String и пытается его распарсить в Int(8 | 16 | 32 | 64 | 128 | 256). Если не удалось — возвращает NULL.
Пример
SELECT toInt64OrNull('123123'), toInt8OrNull('123qwe123');
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐ │ 123123 │ ᴺᵁᴸᴸ │ └─────────────────────────┴───────────────────────────┘
toInt(8 | 16 | 32 | 64 | 128 | 256)OrDefault
Принимает аргумент типа String и пытается его распарсить в Int(8 | 16 | 32 | 64 | 128 | 256). Если не удалось — возвращает значение по умолчанию.
Пример
SELECT toInt64OrDefault('123123', cast('-1' as Int64)), toInt8OrDefault('123qwe123', cast('-1' as Int8));
┌─toInt64OrDefault('123123', CAST('-1', 'Int64'))─┬─toInt8OrDefault('123qwe123', CAST('-1', 'Int8'))─┐ │ 123123 │ -1 │ └─────────────────────────────────────────────────┴──────────────────────────────────────────────────┘
toUInt(8 | 16 | 32 | 64 | 256)
Преобраует входное значение к типу UInt. Семейство функций включает:
- toUInt8(expr) — возвращает значение типа UInt8 .
- toUInt16(expr) — возвращает значение типа UInt16 .
- toUInt32(expr) — возвращает значение типа UInt32 .
- toUInt64(expr) — возвращает значение типа UInt64 .
- toUInt256(expr) — возвращает значение типа UInt256 .
Аргументы
- expr — выражение возвращающее число или строку с десятичным представление числа. Бинарное, восьмеричное и шестнадцатеричное представление числа не поддержаны. Ведущие нули обрезаются.
Возвращаемое значение
Целое число типа UInt8 , UInt16 , UInt32 , UInt64 или UInt256 .
Функции используют округление к нулю, т.е. обрезают дробную часть числа.
Поведение функций для аргументов NaN и Inf не определено. Если передать строку, содержащую отрицательное число, например ‘-32’ , ClickHouse генерирует исключение. При использовании функций помните о возможных проблемах при преобразовании чисел.
Пример
SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8);
┌───────toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐ │ 9223372036854775808 │ 4294967264 │ 16 │ 8 │ └─────────────────────┴───────────────┴────────────────┴──────────────┘
toUInt(8 | 16 | 32 | 64 | 256)OrZero
toUInt(8 | 16 | 32 | 64 | 256)OrNull
toUInt(8 | 16 | 32 | 64 | 256)OrDefault
toFloat(32 | 64)
toFloat(32 | 64)OrZero
toFloat(32 | 64)OrNull
toFloat(32 | 64)OrDefault
toDate
Конвертирует аргумент в значение Date.
Синтаксис
toDate(expr)
Аргументы
- expr — Значение для преобразования. String, Int, Date или DateTime.
Если expr является числом выглядит как UNIX timestamp (больше чем 65535), оно интерпретируется как DateTime, затем обрезается до Date учитывавая текущую часовой пояс. Если expr является числом и меньше чем 65536, оно интерпретируется как количество дней с 1970-01-01.
Возвращаемое значение
Пример
SELECT toDate('2022-12-30'), toDate(1685457500);
┌─toDate('2022-12-30')─┬─toDate(1685457500)─┐ │ 2022-12-30 │ 2023-05-30 │ └──────────────────────┴────────────────────┘
toDateOrZero
Как toDate, но в случае неудачи возвращает нижнюю границу Date). Поддерживается только аргумент типа String.
Пример
SELECT toDateOrZero('2022-12-30'), toDateOrZero('');
┌─toDateOrZero('2022-12-30')─┬─toDateOrZero('')─┐ │ 2022-12-30 │ 1970-01-01 │ └────────────────────────────┴──────────────────┘
toDateOrNull
Как toDate, но в случае неудачи возвращает NULL . Поддерживается только аргумент типа String.
Пример
SELECT toDateOrNull('2022-12-30'), toDateOrNull('');
┌─toDateOrNull('2022-12-30')─┬─toDateOrNull('')─┐ │ 2022-12-30 │ ᴺᵁᴸᴸ │ └────────────────────────────┴──────────────────┘
toDateOrDefault
Как toDate, но в случае неудачи возвращает значение по умолчанию (или второй аргумент (если указан), или нижняя граница Date).
Синтаксис
toDateOrDefault(expr [, default_value])
Пример
SELECT toDateOrDefault('2022-12-30'), toDateOrDefault('', '2023-01-01'::Date);
┌─toDateOrDefault('2022-12-30')─┬─toDateOrDefault('', CAST('2023-01-01', 'Date'))─┐ │ 2022-12-30 │ 2023-01-01 │ └───────────────────────────────┴─────────────────────────────────────────────────┘
toDateTime
Конвертирует аргумент в значение DateTime.
Синтаксис
toDateTime(expr[, time_zone ])
Аргументы
- expr — Значение для преобразования. String, Int, Date или DateTime.
- time_zone — Часовой пояс. String.
Если expr является числом, то оно интерпретируется как число секунд с начала Unix-эпохи (Unix Timestamp).
Если же expr — строка (String), то оно может быть интерпретировано и как Unix Timestamp, и как строковое представление даты / даты со временем.
Ввиду неоднозначности запрещён парсинг строк длиной 4 и меньше. Так, строка ‘1999’ могла бы представлять собой как год (неполное строковое представление даты или даты со временем), так и Unix Timestamp.
Строки длиной 5 символов и более не несут неоднозначности, а следовательно, их парсинг разрешён.
Возвращаемое значение
Пример
SELECT toDateTime('2022-12-30 13:44:17'), toDateTime(1685457500, 'UTC');
┌─toDateTime('2022-12-30 13:44:17')─┬─toDateTime(1685457500, 'UTC')─┐ │ 2022-12-30 13:44:17 │ 2023-05-30 14:38:20 │ └───────────────────────────────────┴───────────────────────────────┘
toDateTimeOrZero
Как toDateTime, но в случае неудачи возвращает нижнюю границу DateTime). Поддерживается только аргумент типа String.
Пример
SELECT toDateTimeOrZero('2022-12-30 13:44:17'), toDateTimeOrZero('');
┌─toDateTimeOrZero('2022-12-30 13:44:17')─┬─toDateTimeOrZero('')─┐ │ 2022-12-30 13:44:17 │ 1970-01-01 00:00:00 │ └─────────────────────────────────────────┴──────────────────────┘
toDateTimeOrNull
Как toDateTime, но в случае неудачи возвращает NULL . Поддерживается только аргумент типа String.
Example
SELECT toDateTimeOrNull('2022-12-30 13:44:17'), toDateTimeOrNull('');
┌─toDateTimeOrNull('2022-12-30 13:44:17')─┬─toDateTimeOrNull('')─┐ │ 2022-12-30 13:44:17 │ ᴺᵁᴸᴸ │ └─────────────────────────────────────────┴──────────────────────┘
toDateTimeOrDefault
Как toDateTime, но в случае неудачи возвращает значение по умолчанию (или третий аргумент (если указан), или нижняя граница DateTime).
Синтаксис
toDateTimeOrDefault(expr, [, time_zone [, default_value]])
Пример
SELECT toDateTimeOrDefault('2022-12-30 13:44:17'), toDateTimeOrDefault('', 'UTC', '2023-01-01'::DateTime('UTC'));
┌─toDateTimeOrDefault('2022-12-30 13:44:17')─┬─toDateTimeOrDefault('', 'UTC', CAST('2023-01-01', 'DateTime(\'UTC\')'))─┐ │ 2022-12-30 13:44:17 │ 2023-01-01 00:00:00 │ └────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘
toDate32
Конвертирует аргумент в значение типа Date32. Если значение выходит за границы диапазона, возвращается пограничное значение Date32 . Если аргумент имеет тип Date, учитываются границы типа Date .
Синтаксис
toDate32(value)
Аргументы
- value — Значение даты. String, UInt32 или Date.
Возвращаемое значение
- Календарная дата.
Пример
- Значение находится в границах диапазона:
SELECT toDate32('1955-01-01') AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32('1955-01-01'))─┐ │ 1955-01-01 │ Date32 │ └────────────┴────────────────────────────────────┘
- Значение выходит за границы диапазона:
SELECT toDate32('1899-01-01') AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32('1899-01-01'))─┐ │ 1900-01-01 │ Date32 │ └────────────┴────────────────────────────────────┘
- С аргументом типа Date :
SELECT toDate32(toDate('1899-01-01')) AS value, toTypeName(value);
┌──────value─┬─toTypeName(toDate32(toDate('1899-01-01')))─┐ │ 1970-01-01 │ Date32 │ └────────────┴────────────────────────────────────────────┘
toDate32OrZero
То же самое, что и toDate32, но возвращает минимальное значение типа Date32, если получен недопустимый аргумент.
Пример
SELECT toDate32OrZero('1899-01-01'), toDate32OrZero('');
┌─toDate32OrZero('1899-01-01')─┬─toDate32OrZero('')─┐ │ 1900-01-01 │ 1900-01-01 │ └──────────────────────────────┴────────────────────┘
toDate32OrNull
То же самое, что и toDate32, но возвращает NULL , если получен недопустимый аргумент.
Пример
SELECT toDate32OrNull('1955-01-01'), toDate32OrNull('');
┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ │ 1955-01-01 │ ᴺᵁᴸᴸ │ └──────────────────────────────┴────────────────────┘
toDate32OrDefault
Конвертирует аргумент в значение типа Date32. Если значение выходит за границы диапазона, возвращается нижнее пограничное значение Date32 . Если аргумент имеет тип Date, учитываются границы типа Date . Возвращает значение по умолчанию, если получен недопустимый аргумент.
Пример
SELECT toDate32OrDefault('1930-01-01', toDate32('2020-01-01')), toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01'));
┌─toDate32OrDefault('1930-01-01', toDate32('2020-01-01'))─┬─toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01'))─┐ │ 1930-01-01 │ 2020-01-01 │ └─────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘
toDateTime64
toDateTime64OrZero
toDateTime64OrNull
toDateTime64OrDefault
toDecimal(32 | 64 | 128 | 256)
Преобразует value к типу данных Decimal с точностью S . value может быть числом или строкой. Параметр S (scale) задаёт число десятичных знаков.
- toDecimal32(value, S)
- toDecimal64(value, S)
- toDecimal128(value, S)
- toDecimal256(value, S)
toDecimal(32 | 64 | 128 | 256)OrNull
Преобразует входную строку в значение с типом данных Nullable (Decimal (P, S)). Семейство функций включает в себя:
- toDecimal32OrNull(expr, S) — Возвращает значение типа Nullable(Decimal32(S)) .
- toDecimal64OrNull(expr, S) — Возвращает значение типа Nullable(Decimal64(S)) .
- toDecimal128OrNull(expr, S) — Возвращает значение типа Nullable(Decimal128(S)) .
- toDecimal256OrNull(expr, S) — Возвращает значение типа Nullable(Decimal256(S)) .
Эти функции следует использовать вместо функций toDecimal*() , если при ошибке обработки входного значения вы хотите получать NULL вместо исключения.
Аргументы
- expr — выражение, возвращающее значение типа String. ClickHouse ожидает текстовое представление десятичного числа. Например, ‘1.111’ .
- S — количество десятичных знаков в результирующем значении.
Возвращаемое значение
Значение типа Nullable(Decimal(P,S)) . Значение содержит:
- Число с S десятичными знаками, если ClickHouse распознал число во входной строке.
- NULL , если ClickHouse не смог распознать число во входной строке или входное число содержит больше чем S десятичных знаков.
Примеры
SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val);
┌────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐ │ -1.111 │ Nullable(Decimal(9, 5)) │ └────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val);
┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐ │ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │ └──────┴────────────────────────────────────────────────────┘
toDecimal(32 | 64 | 128 | 256)OrDefault
Преобразует входную строку в значение с типом данных Decimal(P,S). Семейство функций включает в себя:
- toDecimal32OrDefault(expr, S) — возвращает значение типа Decimal32(S) .
- toDecimal64OrDefault(expr, S) — возвращает значение типа Decimal64(S) .
- toDecimal128OrDefault(expr, S) — возвращает значение типа Decimal128(S) .
- toDecimal256OrDefault(expr, S) — возвращает значение типа Decimal256(S) .
Эти функции следует использовать вместо функций toDecimal*() , если при ошибке обработки входного значения вы хотите получать значение по умолчанию вместо исключения.
Аргументы
- expr — выражение, возвращающее значение типа String. ClickHouse ожидает текстовое представление десятичного числа. Например, ‘1.111’ .
- S — количество десятичных знаков в результирующем значении.
Возвращаемое значение
Значение типа Decimal(P,S) . Значение содержит:
- Число с S десятичными знаками, если ClickHouse распознал число во входной строке.
- Значение по умолчанию типа Decimal(P,S) , если ClickHouse не смог распознать число во входной строке или входное число содержит больше чем S десятичных знаков.
Примеры
SELECT toDecimal32OrDefault(toString(-1.111), 5) AS val, toTypeName(val);
┌────val─┬─toTypeName(toDecimal32OrDefault(toString(-1.111), 5))─┐ │ -1.111 │ Decimal(9, 5) │ └────────┴───────────────────────────────────────────────────────┘
SELECT toDecimal32OrDefault(toString(-1.111), 2) AS val, toTypeName(val);
┌─val─┬─toTypeName(toDecimal32OrDefault(toString(-1.111), 2))─┐ │ 0 │ Decimal(9, 2) │ └─────┴───────────────────────────────────────────────────────┘
toDecimal(32 | 64 | 128 | 256)OrZero
Преобразует тип входного значения в Decimal (P, S). Семейство функций включает в себя:
- toDecimal32OrZero( expr, S) — возвращает значение типа Decimal32(S) .
- toDecimal64OrZero( expr, S) — возвращает значение типа Decimal64(S) .
- toDecimal128OrZero( expr, S) — возвращает значение типа Decimal128(S) .
- toDecimal256OrZero( expr, S) — возвращает значение типа Decimal256(S) .
Эти функции следует использовать вместо функций toDecimal*() , если при ошибке обработки входного значения вы хотите получать 0 вместо исключения.
Аргументы
- expr — выражение, возвращающее значение типа String. ClickHouse ожидает текстовое представление десятичного числа. Например, ‘1.111’ .
- S — количество десятичных знаков в результирующем значении.
Возвращаемое значение
Значение типа Nullable(Decimal(P,S)) . P равно числовой части имени функции. Например, для функции toDecimal32OrZero , P = 32 . Значение содержит:
- Число с S десятичными знаками, если ClickHouse распознал число во входной строке.
- 0 c S десятичными знаками, если ClickHouse не смог распознать число во входной строке или входное число содержит больше чем S десятичных знаков.
Пример
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val);
┌────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐ │ -1.111 │ Decimal(9, 5) │ └────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val);
┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐ │ 0.00 │ Decimal(9, 2) │ └──────┴────────────────────────────────────────────────────┘
toString
Функции преобразования между числами, строками (но не фиксированными строками), датами и датами-с-временем. Все эти функции принимают один аргумент.
При преобразовании в строку или из строки, производится форматирование или парсинг значения по тем же правилам, что и для формата TabSeparated (и почти всех остальных текстовых форматов). Если распарсить строку не удаётся — кидается исключение и выполнение запроса прерывается.
При преобразовании даты в число или наоборот, дате соответствует число дней от начала unix эпохи. При преобразовании даты-с-временем в число или наоборот, дате-с-временем соответствует число секунд от начала unix эпохи.
Форматы даты и даты-с-временем для функций toDate/toDateTime определены следующим образом:
YYYY-MM-DD YYYY-MM-DD hh:mm:ss
В качестве исключения, если делается преобразование из числа типа UInt32, Int32, UInt64, Int64 в Date, и если число больше или равно 65536, то число рассматривается как unix timestamp (а не как число дней) и округляется до даты. Это позволяет поддержать распространённый случай, когда пишут toDate(unix_timestamp), что иначе было бы ошибкой и требовало бы написания более громоздкого toDate(toDateTime(unix_timestamp))
Преобразование между датой и датой-с-временем производится естественным образом: добавлением нулевого времени или отбрасыванием времени.
Преобразование между числовыми типами производится по тем же правилам, что и присваивание между разными числовыми типами в C++.
Дополнительно, функция toString от аргумента типа DateTime может принимать второй аргумент String — имя тайм-зоны. Пример: Asia/Yekaterinburg В этом случае, форматирование времени производится согласно указанной тайм-зоне.
Пример
SELECT now() AS now_local, toString(now(), 'Asia/Yekaterinburg') AS now_yekat;
[PostgreSQL] Как привести строки в INT и другие типы данных?
Есть база PostgreSQL, в одной из таблиц хранятся смешанные значения (т.е. могут быть как текст, так и цифры, так и что угодно ещё), формат поля — VARCHAR.
В некоторые моменты времени, необходимо выбрать все строки, в которых поле N, например, больше 3, например так: SELECT * FROM table1 WHERE field1 > 3;
Но, тут возникает проблема, т.к. field1 не всегда числовое. Я знаю, что в PostgreSQL есть приведения типов, и запрос должен был бы выглядеть примерно так: SELECT * FROM table1 WHERE field1::INTEGER > 3;
Но, как только приведение доходит до нечислового значения — вылетает с ошибкой, «ошибка синтаксиса».
Подскажите пожалуйста, как правильно составить запрос таким образом, что бы всё что можно было привести к нужному типу — автоматически приводилось бы, а всё что нельзя — просто пропускалось бы, без сравнения/приведения?
- Вопрос задан более трёх лет назад
- 9418 просмотров
Комментировать
Решения вопроса 1
Выбрать только то, что является числом.
SELECT field1::integer FROM table1 WHERE field1 ~ E'^\\d+$' AND field1::integer > 3;