如何从TSQL中表示日期的字符串中提取月份

如何从TSQL中表示日期的字符串中提取月份,tsql,stored-procedures,date-conversion,Tsql,Stored Procedures,Date Conversion,在我的SQL Server数据库中,我将日期存储为char(12),格式如下: yyyymmddhhmm 我没有创建定义,无法修改它。我总是在应用程序级别使用C#处理这个字符串 现在我需要在TSQL中执行一项任务,并且我需要按月分组。因此,我需要提取月份。是否有任何TSQL函数可用于此任务 如果没有,那么创建一个存储过程,getMonth(stringDate)来获取字符串并从中提取第4个和第5个字符,这是一个好的解决方案吗?我可以使用以下条款吗 group by getMonth(string

在我的SQL Server数据库中,我将日期存储为char(12),格式如下:

yyyymmddhhmm

我没有创建定义,无法修改它。我总是在应用程序级别使用C#处理这个字符串

现在我需要在TSQL中执行一项任务,并且我需要按月分组。因此,我需要提取月份。是否有任何TSQL函数可用于此任务

如果没有,那么创建一个存储过程,
getMonth(stringDate)
来获取字符串并从中提取第4个和第5个字符,这是一个好的解决方案吗?我可以使用以下条款吗

group by getMonth(stringDate)
在我的问题中?谢谢

你可以

SUBSTRING(fld, 5, 2)
P> >我个人不会为这样简单的东西创建一个UDF(这是你所考虑的,而不是SP),除非你发现你需要把这个字符串转换成<代码> DATETENT/<代码> S/P > < P>你可以;p>
SUBSTRING(fld, 5, 2)

我个人不会为这样简单的东西创建一个UDF(这是你所考虑的,而不是SP)除非你发现你需要把这个字符串转换成<代码> DATESTIME/<代码> S/< > P >你可以使用下面的来获取你的月份,因为月份在4个字符年之后总是2个字符。p>

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

或者另一种获取方法是,您可以通过以下任一查询中的结果对结果进行分组:

declare @date char(12)
set @date = '201203220906'
select Month(cast(left(@date, 8) as datetime))

您可以使用以下内容来获取月份,因为月份总是在4个字符的年份之后2个字符

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

或者另一种获取方法是,您可以通过以下任一查询中的结果对结果进行分组:

declare @date char(12)
set @date = '201203220906'
select Month(cast(left(@date, 8) as datetime))
假定

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))
修剪小时/分钟部分,转换为日期时间并应用月函数

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))
修剪小时/分钟部分,转换为datetime并应用MONTH函数

对于此特定情况(日期为字符类型,格式为yyyymmddhhmm),您可以在查询中使用以下函数:

子字符串(提取yyyymmdd), 转换(以获取日期时间值), datepart(用于获取月份组件)

…然后您可以按月份(或任何日期组件)分组,使用适当的值更改datecolumnname和tablename

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))
对于此特定情况(日期为字符类型,格式为yyyymmddhhmm),您可以在查询中使用以下函数:

子字符串(提取yyyymmdd), 转换(以获取日期时间值), datepart(用于获取月份组件)

…然后您可以按月份(或任何日期组件)分组,使用适当的值更改datecolumnname和tablename

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

您确定要按月份分组而不是按年月分组吗?是否确实要合并不同年份同一月份的值?是否确实要按月份分组而不是按年月分组?是否确实要合并不同年份同一月份的值?