1

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

yyyymmddhhmm

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

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

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

group by getMonth(stringDate)

在我的查询中?谢谢

4

4 回答 4

3

你可以;

SUBSTRING(fld, 5, 2)

就我个人而言,除非您发现自己需要将该字符串转换为DATETIMEs

于 2012-03-22T16:10:18.780 回答
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))
于 2012-03-22T16:10:19.430 回答
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 函数

于 2012-03-22T16:25:14.743 回答
0

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

substring(提取 yyyymmdd)、convert(获取日期时间值)、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))
于 2012-03-22T16:27:02.400 回答