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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Форма, которой вы пользуетесь, указана в документации по онлайн-книгам.

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

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

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

Ответ 5

Функция convert с спецификатором 120 формата даст вам формат "yyyy-MM-dd HH: mm: ss", поэтому вам просто нужно ограничить длину до 10, чтобы получить только часть даты:

convert(varchar(10), theDate, 120)

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

Пример в С#:

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

Ответ 6

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

select convert(varchar,getDate(),112)

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

Ответ 7

Другим способом...

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

Ответ 8

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

Будет также делать трюк без "измельчения чего-либо".

Ответ 9

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

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

Ответ 10

Если кто-то хочет сделать это другим способом и находит это.

select convert(datetime, '12.09.2014', 104)

Преобразует строку в немецкий формат даты в объект datetime.

Почему 104? Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Ответ 11

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

CONVERT (varchar(10), DTvalue, 126)

Это сокращает время. Ваше требование иметь его в yyyy-mm-dd означает, что он должен быть строковым типом данных и datetime.

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

Ответ 12

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

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

Ответ 13

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

Ответ 14

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

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

Ответ 15

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))

Ответ 16

Из SQL Server 2008 вы можете сделать это: CONVERT(date,getdate())

Ответ 17

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

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

Ответ 18

Описание BOL для 126 - это путаница (никогда не было найдено объяснения для "T" ).

Ответ 19

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

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

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.

Ответ 20

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

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

Ответ 21

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

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

Ответ 22

 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;