我的查询中有以下列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,得到错误的输出。
如何编辑查询或转换日期以确保输出正确完成?
答案 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))