Получить месяц и год от даты и времени в SQL Server 2005


87

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


@ Эван Кэрролл - означает ли это угон вопроса? Если у вас есть превосходный ответ на вопрос, не следует ли давать его в качестве ответа на вопрос вместо того, чтобы указывать людям на другой вопрос?
STLDev

@STLDeveloper, как это угон? Вопрос вызывает 2005 год? Я этого не клал. Я не ищу 2005 год .. К сожалению, лучший ответ здесь не работает на 2005 год, это явно 2012 год. Должен ли я отрицать ответы 2005 года за архаичность?
Эван Кэрролл

На самом деле @STLDeveloper, мне все равно. =) Моя официальная позиция всегда заключалась в том, чтобы советовать людям использовать PostgreSQL, не знаю, почему я пытаюсь помочь.
Эван Кэрролл

Мне просто показалось странным, что вы вернулись, чтобы создать новую версию вопроса для другой версии продукта, а затем ответить на этот вопрос, что, я думаю, нормально.
STLDev

Ответы:


74

Если вы имеете в виду, что хотите вернуть их в виде строки в этом формате;

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 4:59 PM»
Nap

1
Это странно - из документов, на которые я ссылался, 100 должно возвращать трехбуквенное сокращение месяца и пробел, если оно помещено в CHAR (4). Но тогда результат, который вы опубликовали для CONVERT (varchar, getdate (), 100), отличается от того, что я ожидал увидеть. Какую версию SQLServer вы используете? Какие настройки локализации / интернационализации вы используете (не то чтобы это должно иметь значение для формата 100).
robsoft

171
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 03

4
@ jp2code месяц и год - это в основном константы, определенные здесь: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL понимает их так же, как вы, читая их :)
Zachary Yates

1
LOL - Спасибо, Зак. Я долго занимался этим, прежде чем разобраться в этом на другом сайте.
jp2code 06

Намного чище, чем функция преобразования. #cleanCode
RBT

51

Начиная с SQL Server 2012, вы можете использовать:

SELECT FORMAT(@date, 'yyyyMM')

1
Хорошо сыграно, сэр ... это ответило на мой вопрос в 2012 году
Squ1rr3lz

Я рад, что дошел до этого места, это аккуратно и просто. Благодарность!
Niklas

Это ценный вклад, но на него нужно было ответить в другом месте, stackoverflow.com/a/43196370/124486
Эван Кэрролл,

12

Использование:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month

11

Забавно, я просто играл с написанием того же запроса в 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

9

В SQL Server 2012 можно использовать нижеприведенное

выберите FORMAT (getdate (), 'MMM yyyy')

Это дает точное «июнь 2016».




5

Такого формата не существует. Вам нужно сделать комбинацию из двух вещей:

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))

4

лучший способ сделать это:

dateadd(month,datediff(month,0,*your_date*),0)

он сохранит ваш тип даты и времени


1
Это, безусловно, лучший ответ для принуждения любой даты быть только месяцем и годом, игнорируя компоненты дня и времени. Намного лучше, чем принятый ответ, потому что информация может быть правильно отсортирована и правильно функционирует как дата в последующих инструментах отчетности.
Джейми Томас

Я полностью согласен с тем, что это, безусловно, лучший способ добиться начала месяца. Он сохраняет тип данных datetime и оставляет рендеринг до внешнего интерфейса, где он должен быть. Это правильный способ делать такие вещи, как группировка строк по месяцам поля.
Джефф Бреднер

2

возвращает полное название месяца, -, полный год, например March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))

2
На этот вопрос уже есть 18 других ответов. Какую новую информацию добавляет ваш ответ?
станниус 08

1

У меня была такая же проблема, и, осмотревшись, я обнаружил следующее:

SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)

Отлично работает!


1

Преобразование даты в первое число месяца позволяет группировать и упорядочивать по одному атрибуту, и, по моему опыту, это быстрее.

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)

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





0

Отлично работает.

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

-3

Следующее работает отлично! Я просто использовал это, попробуйте.

date_format(date,'%Y-%c')

2
это недопустимая функция или оператор sql server
franko_camron 08
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.