如何将字符串转换为日期格式

时间:2014-04-29 13:11:12

标签: sql sql-server date ssms

我的查询中有以下列date_period2,它以yyyy-mm格式显示日期,但是以字符串形式显示。

date_period2
201304
201305
201306
201307

如何将其转换为DATE格式,以便我可以使用它来获取特定月份的工作日。例如,201304将转换为04-2013作为DATE而不是字符串。

这是我的查询,它根据date_period2字段计算表达式,但它不起作用,因为它是字符串格式:

SELECT TOP 1000 [date_period2]
    ,[amount]
    ,[amount]/(SELECT 20 + COUNT(*) FROM 
        (SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, [date_period2]), 28) AS theDate 
            UNION 
        SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, [date_period2]), 29) 
            UNION 
        SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, [date_period2]), 30) ) AS d 
        WHERE DATEPART(DAY, [date_period2]) > 28 AND DATEDIFF(DAY, 0, [date_period2]) % 7 < 5) AS [Weekly Charge]
    FROM [database].[dbo].[table]

问题是amount除以20而不是按月的工作日。

示例:

date_period2    amount          charge average (amount/total working days of the month)
201304          1750359.95      87517.9975

所以根据上面的结果,电荷平均值应该是1750359.95/22,而是将它除以20,得到错误的输出。

如何编辑查询或转换日期以确保输出正确完成?

3 个答案:

答案 0 :(得分:2)

只需将字符串放在明确的日期格式中,例如yyyy-mm-dd

SELECT
    CONVERT(DATETIME,
        SUBSTRING(date_period2,1,4) + '-' 
      + SUBSTRING(date_period2,5,2) + '-01')

这会将201304转换为2013-04-01,直接转换为DateTime

修改

由于您的源列实际上是 integer列,因此更清晰的方法是:

 select CONVERT(DATETIME,CONVERT(CHAR(6),date_period2)+'01')
201304转换为"20130401"

仍然是日期时间解析器的明确含义。

答案 1 :(得分:1)

您可以使用以下逻辑将date_period2转换为日期时间数据类型。

请根据您的需要进行更改。

declare @i int
select @i = CONCAT('201305','01')
select CONVERT (datetime,convert(char(8),@i))

CONCAT('201305','01')&#39; 01&#39;将是不变的,只有&#39; 201305&#39;会改变。

答案 2 :(得分:1)

201404可以转换为04-2014

declare @x VARCHAR(20)
SET @x = convert(varchar(7), getdate(), 126) 
select SUBSTRING(@x,6,CHARINDEX('-',@x)) +'-'+SUBSTRING(@x,0,CHARINDEX('-',@x))