Как получить дату в формате ГГГГ-ММ-ДД из поля даты и времени TSQL?


260

Как получить дату из SQL Server в YYYY-MM-DDформате? Мне нужно это для работы с SQL Server 2000 и выше. Есть ли простой способ сделать это в SQL Server или будет проще преобразовать его программно после получения набора результатов?

Я читал CAST и CONVERT в Microsoft Technet, но нужный мне формат не указан, и изменение формата даты не вариант.


Описание BOL для 126 немного сбивает с толку (так и не удалось найти объяснение "T").
nojetlag

«Т» отделяет дату от времени. См. ISO 8601 в Википедии
krubo

Ответы:


429
SELECT CONVERT(char(10), GetDate(),126)

Ограничение размера varchar отбивных в той порции, которую вы не хотите.


3
Нет, но у некоторых клиентов есть проблемы с фиксированной длиной.
ГБН

55
Этот пост появляется в Google для конвертации в ГГГГММДД - так что это: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Это не сработало для меня, предложение выше с кодом 112 сработало. Спасибо @NealWalters
AlexVPerl

4
Список целочисленных кодов для стилей вывода: msdn.microsoft.com/en-us/library/ms187928.aspx
Бен Франсен,

Код 126 подходит для таких дат, как дата рождения в формате ГГГГ-мм-дд: CONVERT (char (10), pat_dob, 126) as pat_dob
jjwdesign

118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

1
как получить «м / д / гггг» вместо «мм / дд / гггг»
user_az

Это самый полезный ответ, безусловно.
Даниэль

109

Начиная с SQL Server 2012 (оригинальный вопрос для 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')


Это разумный и гибкий способ отображения даты / времени в последних версиях SQL с использованием стандартных форматов Dotnet. Не забудьте прописать месяц ММ, чтобы отличить его от минут. Все форматы времени и даты
джим берез

FORMAT работает (обычно) в 43 раза медленнее, чем CONVERT. Я настоятельно рекомендую вам никогда (и я не использую это слово часто) использовать FORMAT.
Джефф Моден

35

Форма, которую вы запрашиваете, указана в электронной документации по книгам.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Например, попробуйте следующее:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
Если вы выберете значение по умолчанию, в этом случае вы получите значение времени - весь формат для формата 120 - «гггг-мм-дд чч: ми: сс». Явно объявляя длину, она обрезается до формата, который вы указали в исходной заметке - «гггг-мм-дд».
DaveE

26

convertФункция спецификатор формата 120 даст вам формат «ГГГГ-ММ-ДД ЧЧ: мм: сс», так что вы просто должны ограничить длину до 10 , чтобы получить только часть даты:

convert(varchar(10), theDate, 120)

Однако форматирование дат обычно лучше выполнять на уровне представления, а не на уровне базы данных или бизнес-уровня. Если вы возвращаете дату, отформатированную из базы данных, то клиентский код должен снова проанализировать ее, если ему нужно будет выполнить какие-либо вычисления.

Пример в C #:

theDate.ToString("yyyy-MM-dd")

1
Почему отрицательный голос? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ.
Гуффа

14

Для ГГГГММДД попробуйте

select convert(varchar,getDate(),112)

Я тестировал только на SQLServer2008.


7

Еще один способ ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

1
Это создаст 1-значные даты, как в 8/3/2012, если вы хотите 2-значные мм / дд, вам нужно добавить даты слева. RIGHT ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2), например
MindStalker

7

Для тех, кто хотел бы, чтобы часть времени также (я сделал), следующий фрагмент может помочь

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513

6
replace(convert(varchar, getdate(), 111), '/','-')

Также сделаем трюк, не "отрубая что-либо".


Я предпочитаю эту версию, чтобы избежать ошибок "год 9999", связанных с версией convert (varchar (10) ...).
Фрэнсис Хуан,


5

В вашей ссылке и преобразовании используйте стиль 126 таким образом:

CONVERT (varchar(10), DTvalue, 126)

Это усекает время. Ваше требование иметь его в гггг-мм-дд означает, что это должны быть строковый тип данных и дата / время.

Честно говоря, я бы сделал это на клиенте, если у вас нет веских причин не делать этого.


4

Если вы хотите использовать его как дату, а не varcharснова потом, не забудьте преобразовать ее обратно:

select convert(datetime,CONVERT(char(10), GetDate(),126))

разве это не преобразует его обратно в формат системы по умолчанию?
Игнас Вишня

3

Я не уверен, почему самый простой способ был проигнорирован / опущен в ответах выше:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

Я предпочитаю второй, потому что на каком бы языке вы ни говорили, вы поймете, какая это дата!

Кроме того, SQL Server всегда «понимает» это, когда вы отправляете это в процедуру сохранения, независимо от того, какие региональные форматы установлены на компьютерах - я всегда использую полный год (гггг), название месяца (МММ) и 24-часовой формат (заглавная ЧЧ) в течение часа в моем программировании.



2

Вы также можете использовать. Это с использованием нового типа данных DATE. Может работать не во всех предыдущих версиях, но значительно упрощено для использования в более поздних версиях.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

Я хотел бы использовать:

CONVERT(char(10),GETDATE(),126)

1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))


1

Кажется ненужным делать какие-то странные вещи, если вы хотите, чтобы ваша дата была разделена косой чертой. Просто убеги с обратной косой чертой. В противном случае вы получите точку.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

Протестировано на SQL Server 2016


Вы должны проверить это на производительность. ФОРМАТ, как правило, в 43 раза медленнее, чем даже сложный конвертер.
Джефф Моден

0

Использование оператора CASE для каждой функции convert / cast всегда работает для меня:

Пожалуйста, замените tableXXXXY на имя вашей таблицы, а issueDate_dat на имя вашего поля даты и времени в этой таблице:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

Надеюсь, это было полезно. chagbert.


0

Это решение работает для меня, просто и эффективно (с 126 тоже)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

0

Если ваш исходный формат даты испорчен, попробуйте что-то вроде:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a

0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;

Приведенный выше код используется для обеспечения процедуры сохранения параметра в виде мм / дд / гггг
Радж Кумар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.