如何从表示SQL中的日期的String中提取月份

时间:2012-03-22 16:02:36

标签: tsql stored-procedures date-conversion

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

表示为yyyymmddhhmm

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

现在我需要在 TSQL 中执行任务,我需要按月分组。因此我需要提取月份。是否有任何TSQL功能可用于此任务?

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

group by getMonth(stringDate)

在我的查询中?感谢

4 个答案:

答案 0 :(得分:3)

你可以;

SUBSTRING(fld, 5, 2)

就个人而言,我不会为这么简单的东西创建UDF(这是你会考虑的而不是SP),除非你发现自己需要将该字符串强制转换为DATETIME s

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

假设

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功能

答案 3 :(得分:0)

对于这种特定情况(日期为char类型,格式为yyyymmddhhmm),您可以在查询中使用下一个函数:

substring(提取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))