Как преобразовать дату и время в строку в T-SQL

91

Я удивлен, что не могу найти здесь этот вопрос.

У меня есть переменная даты и времени, и я хочу преобразовать ее в строку, чтобы добавить ее в другую строку. Я хочу, чтобы он был в формате, который можно легко преобразовать обратно в дату и время.

Как я могу это сделать?

(Мне нужна часть даты и часть времени.)

cja
источник
@TonyHopkinson У меня тоже было много хитов, но, похоже, все они меняли направление. Или хотите чего-то посложнее.
cja
3
Введите Convert, дважды щелкните, чтобы выделить, нажмите Shift + F1 ... всегда первая линия защиты.
Эрик Дж. Прайс

Ответы:

156

Следующий запрос получит текущую дату и время и преобразует ее в строку. со следующим форматом
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 
Джон Ву
источник
49
Я до сих пор не могу
смириться
4
@cja Я полностью разделяю ваше удивление. Я хочу предоставить строку, например yyddss, чтобы получить точный формат, который мне нужен. Вероятно, этому есть техническая или историческая причина. Но все же - очень неожиданно.
Конрад Вильтерстен
2
Спасибо за быстрое исправление, но в своем ответе вы кодируете месяцы как минуты, гггг-ММ-дд чч: мм: сс НЕ гггг-мм-дд чч: мм: сс
Том Мартин
Хотя это и старый, я только что наткнулся на эту ветку. При использовании DateTimeOffSetне забудьте отрегулировать varcharдлину так, как вы хотите, чтобы результат выглядел. Для меня мне не нужен часовой пояс, поэтому мне пришлось использоватьSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs
7

Вы можете использовать convertинструкцию в Microsoft SQL Server для преобразования даты в строку. Пример используемого синтаксиса:

SELECT convert(varchar(20), getdate(), 120)

Вышеупомянутое вернет текущую дату и время в виде строки YYYY-MM-DD HH:MM:SSв 24-часовом формате.

Вы можете изменить число в конце оператора на одно из многих, что изменит формат возвращаемых строк. Список этих кодов можно найти на MSDN в справочном разделе CAST и CONVERT .

Джереми1026
источник
7

Есть 3 разных метода в зависимости от того, что мне нужно и какую версию я использую.

Вот методы ..

1) Использование Convert

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Использование Cast (SQL Server 2008 и выше)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Использование символьного типа данных фиксированной длины

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'
Тодд Дж. Хайден
источник
5

В дополнении к CASTи CONVERTфункциям в предыдущих ответах, если вы используете SQL Server 2012 и выше вы используете FORMAT функцию , чтобы преобразовать DATETIMEтип , основанный на строку.

Для обратного преобразования используйте противоположные функции PARSEили TRYPARSE.

Стили форматирования основаны на .NET (аналогично параметрам форматирования строк в методе ToString ()) и имеют то преимущество, что учитывают региональные особенности. например.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Полученные результаты:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000
g2server
источник
Я что-то упустил или проблема OP решена с помощью FORMAT (<date var>, 'dd MMMM yyyy HH: mm: ss') или любого другого нужного вам формата даты ?!
Grim
@Grim, ты тоже можешь это сделать. Из документацииThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
g2server 02
Я думаю, ты здесь слишком много работаешь. SQL Server имеет неявные строковые эквиваленты для DATETIME2. На самом деле вы здесь используете неявное преобразование, а затем форматируете полученную строку, а не дату и время.
Джейми Маршалл
@JamieMarshall более-менее. MSDN предлагает:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
g2server
1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - США - ММ / ДД / ГГГГ

108 - Время - ЧЧ: МИ: СС

112 - Дата - ГГГГММДД

121 - ODBC - ГГГГ-ММ-ДД ЧЧ: MI: SS.FFF

20 - ODBC - ГГГГ-ММ-ДД ЧЧ: MI: SS

Раджсантош Шринивасан
источник
1

На этот вопрос ответило множество людей, но я чувствую, что самое простое решение было упущено.

SQL SERVER (я считаю, что это 2012+) имеет неявные строковые эквиваленты для DATETIME2, как показано здесь

См. Раздел «Поддерживаемые форматы строковых литералов для datetime2»

Чтобы ответить на вопрос OPs явно:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

выход:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Примечание: первая переменная ( myVar) на самом деле также содержит значение '2019-01-23 12:24:00.0000000'. Он просто форматируется Jan 23 2019 12:24PMиз-за набора форматирования по умолчанию для SQL SERVER, который вызывается при использовании PRINT. Не запутайтесь, фактическая строка в (myVer)='2019-01-23 12:24:00.0000000'

Джейми Маршалл
источник
0

Попробуйте ниже:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
Gaurav123
источник
1
Хороший !! Нужно ли нам писать и ВЛЕВО?
Gaurav123
Занимает 10 первых символов, поэтому, если вам это нужно, если вам просто нужна дата.
ram4nd