Як отримати дату у форматі "РРРР-ММ-DD" із поля дати TSQL?


259

Як отримати дату з SQL Server у YYYY-MM-DDформаті? Мені це потрібно для роботи з SQL Server 2000 і новіших версій. Чи є простий спосіб виконати це в SQL Server чи було б простіше перетворити його програмно після отримання набору результатів?

Я читав CAST і CONVERT в Microsoft Technet, але потрібний формат не вказаний, і змінити формат дати - це не варіант.


Опис BOL для 126 є дещо плутаниною (жодного разу не знайшов пояснення для "T").
nojetlag

"T" відокремлює дату від часу. Дивіться ISO 8601 у Вікіпедії
крубо

Відповіді:


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

Обмеження розміру варчарських відбивних частин, які ви не хочете.


3
Ні, але деякі клієнти мають проблеми із фіксованою довжиною.
gbn

54
Ця публікація з’являється в Google для переходу на YYYYMMDD - так, що це: 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) як 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
як отримати 'm / d / yyyy' замість 'mm / dd / yyyy'
user_az

На сьогодні це найкорисніша відповідь.
Даніель

109

Починаючи з SQL Server 2012 (оригінальне запитання для 2000 року):

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


Це розумний гнучкий спосіб робити дату / час у останніх версіях SQL, використовуючи стандартні формати Dotnet. Не забудьте з великої літери вилучити місяць, щоб відрізнити його від хвилин. Усі формати часу для дати
jim birch

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 - "yyyy-mm-dd hh: mi: ss". Явно оголошуючи довжину, вона підрізається до формату, який ви вказали в оригінальній примітці - "yyyy-mm-dd".
DaveE

26

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

convert(varchar(10), theDate, 120)

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

Приклад в C #:

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

1
Чому потік? Якщо ви не поясните, що ви вважаєте неправильним, це не може покращити відповідь.
Гуффа

14

Для YYYYMMDD спробуйте

select convert(varchar,getDate(),112)

Я протестував лише на SQLServer2008.


7

Ще один спосіб ...

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

1
Це створить одноцифрові дати, як у 8.08.2012, якщо ви хочете, щоб двозначний мм / дд вам потрібно було залишити дати. ВПРАВО ('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", пов'язаних з версією conver (varchar (10) ...).
Френсіс Хуанг


5

У посиланні для перетворення та перетворення використовуйте стиль 126 таким чином:

CONVERT (varchar(10), DTvalue, 126)

Це обрізає час. Ваша вимога мати його в yyyy-mm-dd означає, що він повинен бути рядковим типом даних та датою.

Відверто кажучи, я зробив би це на клієнті, якщо у вас немає вагомих причин цього не робити.


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 завжди "розуміє" це, коли ви надсилаєте це в процедуру збереження, незалежно від того, які регіональні формати встановлені на комп'ютерах - я завжди використовую повний рік (yyyy), ім'я місяця (MMM) та 24-годинний формат (велика HH) за годину в моєму програмуванні.



2

Ви також можете використовувати. Це відбувається за допомогою нового типу даних DATE. Може не працювати у всіх попередніх версіях, але значно спрощено використовувати їх у більш пізній версії.

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


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


Ви повинні перевірити його на продуктивність. FORMAT, як правило, в 43 рази повільніше, ніж навіть складний КОНВЕРТ.
Джефф Моден

0

Використання оператора CASE для кожної з функцій перетворення / виведення завжди працює для мене:

Будь ласка, замініть tableXXXXY на ім'я таблиці та видалітьDate_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

Сподіваюся, що це було корисно. чагбер.


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;

Код вище використовується для надання процедури зберігання для параметра у вигляді mm / dd / yyyy
Радж Кумар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.