varchar列的会计期间名称

时间:2018-09-25 02:50:58

标签: sql sql-server

我对SQL相当陌生,并从这个论坛中学到了很多东西。谢谢大家!

还有一个我需要专家咨询的东西。

我有一栏,基本上是财政期。但是,它不是日期列,而是类型varchar

目的是操纵列值以从中获取会计月份的名称。

因此在下面的示例中,我有Fiscal_Period列可用,并且我需要FiscalMonth列。

Fiscal_Period   FiscalMonth
----------------------------
2018001             Jan
2018002             Feb
2018003             Mar
2018004             Apr
2018005             May
2018006             Jun
2018007             Jul
2018008             Aug
2018009             Sep
2018010             Oct
2018011             Nov
2018012             Dec

是否有一种简单的方法可以实现这一目标?

我当前的黑客方法是:

  1. 使用子字符串和concat函数将Fiscal_Period列转换为YYYY-DD-MM格式
  2. 使用Datetime转换为日期,然后从中提取月份
  3. 使用MonthDatename函数

我的查询:

SELECT 
    DATENAME(MONTH, (CONVERT(DATETIME, (CONCAT(SUBSTRING(FISCAL_PERIOD, 1, 4), '-', SUBSTRING(FISCAL_PERIOD, 6, LEN(FISCAL_PERIOD)), '-', '11'))))) AS PeriodName 
FROM
    table 1  

干杯!

3 个答案:

答案 0 :(得分:2)

这有点短

input

如果只希望使用缩写的月份名称,则在上面的表达式上使用LEFT()

答案 1 :(得分:2)

由于您只需要一个月份名称,因此年份或日期都不需要更改,因此可以为它们使用常量。在T-SQL中,可以安全地将等于YYYYMMDD的文字用作日期,因此:

sudo apt install ca-certificates-java
sudo update-ca-certificates -f

答案 2 :(得分:0)

这基本上是已经给出的答案,只是想出id完成输入即可。它依赖于使用给定的日期格式填写问题,但其他方面的工作原理相同。

;with src (dt) as
(

select convert(date, '20180101', 120) union all
select '20180201' union all
select '20180301' union all
select '20180401' union all
select '20180501' union all
select '20180601' union all
select '20180701' union all
select '20180801' union all
select '20180901' union all
select '20181001' union all
select '20181101' union all
select '20181201'
)
select 
    Dt,
    left(datename(month, dt), 3)
from src