Мне нужен месяц + год от даты и времени в SQL Server, например «Январь 2008». Группирую запрос по месяцам, годам. Я искал и нашел такие функции, как datepart, convert и т. д., Но ни одна из них не кажется полезной для этого. Я что-то упустил? Есть ли для этого функция?
@STLDeveloper, как это угон? Вопрос вызывает 2005 год? Я этого не клал. Я не ищу 2005 год .. К сожалению, лучший ответ здесь не работает на 2005 год, это явно 2012 год. Должен ли я отрицать ответы 2005 года за архаичность?
На самом деле @STLDeveloper, мне все равно. =) Моя официальная позиция всегда заключалась в том, чтобы советовать людям использовать PostgreSQL, не знаю, почему я пытаюсь помочь.
Мне просто показалось странным, что вы вернулись, чтобы создать новую версию вопроса для другой версии продукта, а затем ответить на этот вопрос, что, я думаю, нормально.


Такого формата не существует. Вам нужно сделать комбинацию из двух вещей:
select convert(varchar(4),getdate(),100) + convert(varchar(4),year(getdate()))
Если вы имеете в виду, что хотите вернуть их в виде строки в этом формате;
SELECT
CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120)
FROM customers
Я попытался использовать CONVERT (CHAR (4), GetDate (), 100) на моем SQL Server и получил вместо этого «09 1». Я получил пробел и одну «1» для 17. с помощью «select CONVERT (varchar, GetDate (), 100)« yield »09 17 2009 16:59»
Это странно - из документов, на которые я ссылался, 100 должно возвращать трехбуквенное сокращение месяца и пробел, если оно помещено в CHAR (4). Но тогда результат, который вы опубликовали для CONVERT (varchar, getdate (), 100), отличается от того, что я ожидал увидеть. Какую версию SQLServer вы используете? Какие настройки локализации / интернационализации вы используете (не то чтобы это должно иметь значение для формата 100).
select
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
Итак, я думаю, что это то, что я хочу, но я не понимаю, как TSQL поймет разницу между datepart(month,getdate()) и datepart(year,getdate()). Что такое месяц и год?
@ jp2code месяц и год - это в основном константы, определенные здесь: msdn.microsoft.com/en-us/library/ms174420.aspx. TSQL понимает их так же, как и вы, читая их :)
LOL - Спасибо, Зак. Я долго занимался этим, прежде чем разобраться в этом на другом сайте.
Намного чище, чем функция преобразования. #cleanCode
( Month(Created) + ',' + Year(Created) ) AS Date
Забавно, я просто играл с написанием того же запроса в SQL Server, а затем в LINQ.
SELECT
DATENAME(mm, article.Created) AS Month,
DATENAME(yyyy, article.Created) AS Year,
COUNT(*) AS Total
FROM Articles AS article
GROUP BY
DATENAME(mm, article.Created),
DATENAME(yyyy, article.Created)
ORDER BY Month, Year DESC
Он производит следующий вывод (пример).
Month | Year | Total
January | 2009 | 2
У меня была такая же проблема, и, осмотревшись, я обнаружил следующее:
SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)
Отлично работает!
Как насчет этого?
Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
Да, вы можете использовать datename(month,intime), чтобы получить месяц в тексте.
Использовать:
select datepart(mm,getdate()) --to get month value
select datename(mm,getdate()) --to get name of month
Следующее работает отлично! Я просто использовал это, попробуйте.
date_format(date,'%Y-%c')
это недопустимая функция или оператор sql server
Преобразование даты в первое число месяца позволяет группировать и упорядочивать по одному атрибуту, и, по моему опыту, это быстрее.
declare @mytable table(mydate datetime)
declare @date datetime
set @date = '19000101'
while @date < getdate() begin
insert into @mytable values(@date)
set @date = dateadd(day,1,@date)
end
select count(*) total_records from @mytable
select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt
from @mytable
group by dateadd(month,datediff(month,0,mydate),0)
---Lalmuni Demos---
create table Users
(
userid int,date_of_birth date
)
---insert values---
insert into Users values(4,'9/10/1991')
select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years,
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months,
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
cast(cast(sq.QuotaDate as date) as varchar(7))
дает формат "2006-04"
лучший способ сделать это:
dateadd(month,datediff(month,0,*your_date*),0)
он сохранит ваш тип даты и времени
Это, безусловно, лучший ответ для принуждения любой даты быть только месяцем и годом, игнорируя компоненты дня и времени. Намного лучше, чем принятый ответ, потому что информация может быть правильно отсортирована и правильно функционирует как дата в последующих инструментах отчетности.
Я полностью согласен с тем, что это, безусловно, лучший способ добиться начала месяца. Он сохраняет тип данных datetime и оставляет рендеринг до внешнего интерфейса, где он должен быть. Это правильный способ делать такие вещи, как группировка строк по месяцам поля.
Начиная с SQL Server 2012, вы можете использовать:
SELECT FORMAT(@date, 'yyyyMM')
Хорошо сыграно, сэр ... это ответило на мой вопрос в 2012 году
Я рад, что дошел до этого места, это аккуратно и просто. Спасибо!
Это ценный вклад, но на него следовало ответить в другом месте, stackoverflow.com/a/43196370/124486
Вопрос касается SQL Server 2005, многие ответы здесь относятся к более поздней версии SQL Server.
select convert (varchar(7), getdate(),20)
--Typical output 2015-04
SQL Server 2005 не имеет функции даты который был представлен в SQL Server 2008
,datename(month,(od.SHIP_DATE)) as MONTH_
Отвечать: МЕСЯЦ_ Январь Январь сентябрь Октябрь Декабрь Октябрь сентябрь
В SQL Server 2012 можно использовать нижеприведенное
выберите ФОРМАТ (getdate (), 'MMM yyyy')
Это дает точное «июнь 2016».
возвращает полное название месяца, -, полный год, например March-2017
CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
На этот вопрос уже есть 18 других ответов. Какую новую информацию добавляет ваш ответ?
Отлично работает.
DECLARE @pYear VARCHAR(4)
DECLARE @pMonth VARCHAR(2)
DECLARE @pDay VARCHAR(2)
SET @pYear = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4)
SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2)
SET @pDay = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2)
SELECT @pYear,@pMonth,@pDay
@ Эван Кэрролл - означает ли это угон вопроса? Если у вас есть превосходный ответ на вопрос, не следует ли давать его в качестве ответа на вопрос вместо того, чтобы указывать людям на другой вопрос?