Отримайте місяць і рік з дати в 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 16:59"
Нед

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

4
@ jp2code місяць і рік - це в основному константи, визначені тут: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL розуміє їх так само, як і ви, читаючи їх :)
Zachary Yates

1
LOL - Дякую Зак. Я довго знімав це перед тим, як з’ясувати це на іншому сайті.
jp2code

Набагато чистіше, ніж функція перетворення. #cleanCode
RBT

51

Починаючи з SQL Server 2012, ви можете використовувати:

SELECT FORMAT(@date, 'yyyyMM')

1
Добре зіграно, сер ... це відповіло на моє запитання у 2012 році
Squ1rr3lz,

Я радий, що прокрутив так далеко, це акуратно і просто. Дякую!
Ніклас,

Це цінний внесок, але на нього слід було б відповісти в іншому місці, 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 можна використовувати нижче

виберіть ФОРМАТ (getdate (), 'МММ рррр))

Це дає точний "червень 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 інших відповідей. Яку нову інформацію додає ваша відповідь?
stannius

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-сервера
franko_camron
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.