Как получить дату в формате гггг-ММ-ДД из поля TSQL datetime?
Как получить дату из SQL Server в формате гггг-ММ-ДД? Мне это нужно для работы с SQL Server 2000 и выше. Есть ли простой способ выполнить это в SQL Server или было бы проще преобразовать его программно после получения результирующего набора?
Я прочитала приведение и преобразование на Microsoft Technet, но формат, который я хочу, не указан, и изменение формата даты не является опцией.
20 ответов:
SELECT CONVERT(char(10), GetDate(),126)ограничение размера отбивных varchar части часа, которые вы не хотите.
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
форма, которую вы ищете, указана в электронной документации.
http://msdn.microsoft.com/en-us/library/aa226054 (SQL. 80). aspx
например, попробуйте следующее:
select convert(varchar,getDate(),120) select convert(varchar(10),getDate(),120)
The
convertфункция со спецификатором формата 120 даст вам формат "yyyy-MM-dd HH:mm:ss", поэтому вам просто нужно ограничить длину до 10, чтобы получить только часть даты:convert(varchar(10), theDate, 120)однако форматирование дат, как правило, лучше делать на уровне презентации, а не в базе данных или бизнес-уровне. Если вы возвращаете дату, отформатированную из базы данных, то клиентский код должен снова проанализировать ее до даты, если ему нужно выполнить какие-либо вычисления оно.
пример в C#:
theDate.ToString("yyyy-MM-dd")
еще один способ...
CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime))
в случае, если кто-то хочет сделать это наоборот и находит это.
select convert(datetime, '12.09.2014', 104)это преобразует строку в немецком формате даты в объект datetime.
почему 104? смотрите здесь: http://msdn.microsoft.com/en-us/library/ms187928.aspx
для тех, кто хотел бы часть времени (я сделал), следующий фрагмент может помочь
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
в вашей ссылке приведения и преобразования используйте стиль 126 таким образом:
CONVERT (varchar(10), DTvalue, 126)Это усекает время. Ваше требование иметь его в yyyy-mm-dd означает, что он должен быть строковым типом данных и datetime.
честно говоря, я бы сделал это на клиенте, если у вас нет веских причин этого не делать.
Если вы хотите использовать его в качестве даты вместо
varcharснова после этого, не забудьте преобразовать его обратно:select convert(datetime,CONVERT(char(10), GetDate(),126))
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))
использование оператора CASE для каждой из функций convert / cast всегда работает для меня:
пожалуйста, замените tablexxxxxy вашим именем таблицы и 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надеюсь, это было полезно. чагберт.
Это решение работает для меня, простой и эффективный (с 126 тоже)
CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
Если ваш исходный формат даты все испортил, попробуйте что-то вроде:
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
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;
Comments