Как извлечь месяц из строки, представляющей дату в TSQL - PullRequest
1 голос
/ 22 марта 2012

В моей базе данных SQL Server даты хранятся в виде char (12) в следующем формате:

ГГГГММДДЧЧмм

Я не создал определение и не могу его изменить. Я всегда имел дело с этой строкой на уровне приложения, используя C #.

Теперь мне нужно выполнить задачу в TSQL и мне нужно сгруппировать по месяцам . Поэтому мне нужно извлечь месяц. Есть ли какая-либо функция TSQL для этой задачи?

Если нет, то является ли хорошим решением создание хранимой процедуры, getMonth(stringDate), которая берет строку и извлекает из нее 4-й и 5-й символы? Могу ли я использовать пункт:

group by getMonth(stringDate)

в моем запросе? Спасибо

Ответы [ 4 ]

3 голосов
/ 22 марта 2012

Вы можете;

SUBSTRING(fld, 5, 2)

Лично я не стал бы создавать UDF для чего-то такого простого (что вы бы предпочли, а не SP), если только вам не понадобится привести эту строку к DATETIME s

1 голос
/ 22 марта 2012

Предполагая

CREATE TABLE #Table(
    DateValue char(12),
    Value int)

INSERT INTO #Table VALUES ('20120110833', 1)
INSERT INTO #Table VALUES ('20120110833', 2)
INSERT INTO #Table VALUES ('20120110833', 3)
INSERT INTO #Table VALUES ('20120210833', 4)
INSERT INTO #Table VALUES ('20120210833', 5)

Вы можете просто сделать это:

select 
    MONTH(CAST(LEFT(DateValue, 8) as datetime)) Month, 
    SUM(value)
FROM
    #Table
GROUP BY
    MONTH(CAST(LEFT(DateValue, 8) as datetime))

обрезать часть часа / минуты, привести к дате и применить функцию MONTH

1 голос
/ 22 марта 2012

Вы можете использовать следующее, чтобы получить свой месяц, так как месяц всегда равен 2 символам после года из 4 символов.

declare @date char(12)
set @date = '201203220906'
select substring(@date, 5, 2)

результаты: 03

или другой способ получить его, тогда вы можете group by результаты в любом запросе:

declare @date char(12)
set @date = '201203220906'
select Month(cast(left(@date, 8) as datetime))
0 голосов
/ 22 марта 2012

Для этого конкретного случая (дата в типе символа в формате ггггммддччмм) вы можете использовать в своем запросе следующие функции:

подстрока (для извлечения ггггммдд), преобразование (для получения значения даты и времени), дата части (чтобы получить компонент месяца)

... затем вы можете сгруппировать по месяцам (или любому другому компоненту даты), изменить имя столбца даты и таблицы с соответствующими значениями

select datepart(month,convert(datetime,substring(datecolumnname,1,8),112)), 
   count(datepart(month,convert(datetime,substring(datecolumnname,1,8),112))) 
from tablename 
   group by datepart(month,convert(datetime,substring(datecolumnname,1,8),112))
...