在我的 SQL Server数据库中,我将日期存储为 char(12),格式如下:
表示为yyyymmddhhmm
我没有创建定义,我无法修改它。我总是在应用程序级别使用C#处理此字符串。
现在我需要在 TSQL 中执行任务,我需要按月分组。因此我需要提取月份。是否有任何TSQL功能可用于此任务?
如果没有,创建存储过程getMonth(stringDate)
是一个很好的解决方案,它接受字符串并从中提取第4和第5个字符?我可以使用以下条款:
group by getMonth(stringDate)
在我的查询中?感谢
答案 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))