转换为nvarchar日期(DD / MM / YYYY),以期日期(YYYY_MM)

问题描述 投票:0回答:5

我想这个转换成一个时期的格式,所以例如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。

sql sql-server tsql
5个回答
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
投票

这是存储与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列的其他查询。


0
投票

如果你的数据是在DD / MM / YYYY格式,然后它被存储为一个字符串。因此,字符串函数浮现在脑海中:

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

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是参考


0
投票

为什么不只是做谈话? :

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

这是假定RESERVED_FIELD_4date类型。

© www.soinside.com 2019 - 2024. All rights reserved.