Як перетворити дату-час у рядок у T-SQL


91

Я здивований, що вже не можу знайти тут цього питання.

У мене є дата-дата і я хочу перетворити його на рядок, щоб я міг додати його до іншого рядка. Я хочу його у форматі, який можна легко перетворити назад на час дати.

Як я можу це зробити?

(Я хочу частину дати та часову частину.)


@TonyHopkinson Я теж отримав багато хітів, але всі вони, здавалося, конвертували інший шлях. Або бажаючи чогось більш складного.
cja

3
Введіть Convert, двічі клацніть, щоб виділити, натисніть Shift + F1 ... завжди перша лінія захисту.
Ерік Дж. Прайс

Відповіді:


156

Наступний запит отримає поточну дату та перетворить у рядок. у наступному форматі
yyyy-mm-dd hh:mm:ss(24h)

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

48
Я все ще не можу
здолати

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:SS24-годинного годинника.

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


7

Існує 3 різні методи, залежно від того, який я є моєю вимогою, і яку версію я використовую.

Ось методи ..

1) Використання перетворення

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

Мені чогось не вистачає, чи проблема з операційними програмами вирішена за допомогою FORMAT (<дата змін>, 'дд ММММ рррр ЧГ: мм: сс') або яким-небудь спеціальним форматом дати, який вам потрібен ?!
Похмурий

@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.03.18

Я думаю, ви насправді тут занадто багато працюєте. 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 - Час - HH: MI: SS

112 - Дата - РРРРММДД

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

20 - ODBC - РРРР-ММ-ДД HH: MI: SS


1

На це відповіли багато людей, але я відчуваю, що найпростіше рішення залишилось поза увагою.

SQL SERVER (я вважаю, що його версія 2012+) має неявні еквіваленти рядків для DATETIME2, як показано тут

Подивіться на розділ "Підтримувані формати рядкових літералів для datetime2"

Щоб чітко відповісти на запитання щодо операційних систем:

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)

1
Добре !! Чи нам також потрібно писати ВЛІВО?
Gaurav123

Потрібно 10 перших символів, тому якщо вам це потрібно, якщо ви просто хочете побачитись.
ram4nd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.