将nvarchar日期(DD / MM / YYYY)转换为日期期限(YYYY_MM)

时间:2019-02-05 13:34:48

标签: sql sql-server tsql

我正在尝试将其转换为周期格式,例如2018_05(YYYY_MM)。当前数据为DD / MM / YYYY格式。

我尝试了强制转换代码,但返回了YYYY_DD。

SELECT   
CASE WHEN RESERVED_FIELD_4 IS NULL THEN NULL
     ELSE cast(year(RESERVED_FIELD_4) as Nvarchar (4)) 
     +'_'+right('00'+cast(month(RESERVED_FIELD_4)   as Nvarchar (2)),2)
END AS [DATAFEED_PERIOD]

我希望/希望看到YYYY_MM。

5 个答案:

答案 0 :(得分:1)

假设RESERVED_FIELD_4是字符串类型(char / nchar / varchar / nvarchar),最简单的解决方案是使用substring

CASE
WHEN RESERVED_FIELD_4 IS NULL THEN NULL
ELSE SUBSTRING(RESERVED_FIELD_4, 7, 4) + '_'+ SUBSTRING(RESERVED_FIELD_4, 4, 2)
END AS [DATAFEED_PERIOD]

如果它是date / datetime / datetime2数据类型,则最简单的解决方案是使用format

FORMAT(RESERVED_FIELD_4, 'yyyy_MM')

但是要获得更好的性能,可以使用convertstuff

SELECT STUFF(CONVERT(char(6), RESERVED_FIELD_4, 112), 5, 0, '_')

如果您的格式实际上是d/m/y,最简单的选择是将其转换为日期,而不是转换为字符串:

SELECT STUFF(CONVERT(char(6), CONVERT(Date, RESERVED_FIELD_4, 103), 112), 5, 0, '_')

答案 1 :(得分:1)

这是使用VARCHAR列存储日期的常见问题。您正在猜测存储的模式是DD/MM/YYYY,但是SQL引擎不知道该存储模式,目前正在采用MM/DD/YYYY模式。

请检查以下结果:

-- MM/DD/YYYY
SELECT
    DAY  ('05/01/2019'),        -- 1
    MONTH('05/01/2019')         -- 5

-- DD/MM/YYYY
SELECT
    DAY  ('25/05/2019'),        -- Conversion failed when converting date and/or time from character string
    MONTH('25/05/2019')         -- Conversion failed when converting date and/or time from character string.

要正确显示所需内容,请使用字符串函数:

SELECT
    RIGHT(RESERVED_FIELD_4, 4) + '_' + SUBSTRING(RESERVED_FIELD_4, 4, 2)

但是您实际上应该在VARCHAR列上固定值,将其强制转换为DATE并将这些值存储为DATE

ALTER TABLE YourTable ADD ReservedField4Date DATE

UPDATE YourTable SET 
    ReservedField4Date = CONVERT(DATE, 
        RIGHT(RESERVED_FIELD_4, 4)                      -- Year
        + '-' + SUBSTRING(RESERVED_FIELD_4, 4, 2)       -- Month
        + '-' + LEFT(RESERVED_FIELD_4, 2))              -- Day

ALTER TABLE YourTable DROP COLUMN RESERVED_FIELD_4

EXEC sp_rename 'SchemaName.YourTable.ReservedField4Date', 'RESERVED_FIELD_4', 'COLUMN'

请注意,更改列类型可能会影响其他假设这是VARCHAR列的查询。

答案 2 :(得分:0)

为什么不只是对话? :

SELECT REPLACE(CONVERT(VARCHAR(7), CONVERT(date, RESERVED_FIELD_4, 101), 102), '.', '_')

这假设RESERVED_FIELD_4date类型。

答案 3 :(得分:0)

在SQL-SERVER中,您可以使用“格式”

format(dy,@your_date) as day_of_year

month(@your_date) as month

尝试一下:

Select concat(month(@your_date),'_'year(@your_date)) as your_period

this是参考

答案 4 :(得分:0)

如果您的数据采用DD / MM / YYYY格式,则将其存储为字符串。因此,想到了字符串函数:

select right(RESERVED_FIELD_4) + '_' + substrint(RESERVED_FIELD_4, 4, 2)