我想在3个字段的列中分割日期,我使用此查询
SELECT
SUBSTRING(Account.date, 1, 2) AS "Month",
SUBSTRING(Account.date, 4, 2) AS "Day",
SUBSTRING(Account.date, 7, 4) AS "Year"
FROM Account
几乎所有数据都采用02/11/2000
格式,但有些数据可以是02/November/2000
或2/11/2000
。
唯一常见的是由/
分隔的数据。如何使用分隔符分隔此列?
答案 0 :(得分:4)
令人惊讶CAST('2/November/2000' as datetime)
有效(在SQL Server 2008上查看),给出值 2000-11-02 00:00:00.000
SELECT
Month(CAST(Account.date AS DateTime)) "Month",
Day(CAST(Account.date AS DateTime)) "Day",
Year(CAST(Account.date AS DateTime)) "Year",
FROM Account
但正如评论中正确指出的,你如何知道“02/11/2000”是2000年11月2日还是2000年2月11日?
月份名称的拼写必须绝对正确,否则转换失败。由于您将日期存储为字符串,因此可能会像11月,Agust等一样进入。
您永远不应将日期值存储为字符串。
答案 1 :(得分:3)
您可以使用CHARINDEX
和SUBSTRING
函数
select
LEFT(Account.date, CHARINDEX('/', Account.date) - 1),
SUBSTRING(Account.date, CHARINDEX('/', Account.date) + 1, LEN(Account.date) - CHARINDEX('/', Account.date) - CHARINDEX('/', Account.date, CHARINDEX('/', Account.date)) - 2),
REVERSE(LEFT(REVERSE(Account.date), CHARINDEX('/', REVERSE(Account.date)) - 1))
FROM Account
答案 2 :(得分:1)
您可以稍微滥用PARSENAME功能:
SELECT FirstPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 3),
SecondPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 2),
ThirdPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 1)
FROM (VALUES
('02/November/2000'),
('2/11/2000')
) Account (Date);
会给:
FirstPart SecondPart ThirdPart
02 November 2000
2 11 2000
但是,我强烈推荐storing your dates using the appropriate data type!。 SQL Server 2012具有TRY_CONVERT功能,可以使这种转换更容易,但您仍需要知道字符串日期的格式,2/11/2000
可能是11月2日或2月11日,具体取决于您所在地区设置。
答案 3 :(得分:0)
您可以在SQL中使用CharIndex和Substring函数的组合来根据分隔符拆分字符串。
您可以在此处查看CharIndex示例SQL Server 2005 Using CHARINDEX() To split a string 在这里SQL Server - find nth occurrence in a string
答案 4 :(得分:0)
假设您的数据库列account.date
包含有效的datetime
或date
值,您应该使用SQLServers日期函数,如:
select month(getDate()) as "Month",
day(getDate()) as "Day",
year(getDate()) as "Year"
我将您的列account.date
替换为getDate()
以获得一些测试值。这将按以下方式映射到您的SQL
SELECT
month(Account.date) AS "Month",
day(Account.date) AS "Day",
year(Account.date) AS "Year"
FROM Account
将这些日期值存储为varchars将是IMHO数据库结构的设计缺陷。日期以多种方式格式化为文本。这是数据库数据的表示。要处理数据,您始终会预处理文本日期。这是不好的做法。
如果你确实有varchar值,那么有几个SO问题,例如:How do I split a string so I can access item x?。
答案 5 :(得分:0)
试试这个:
DECLARE @VALUE VARCHAR(100)<BR>
SET @VALUE ='2/11/2000' <BR>
SELECT SUBSTRING(@VALUE,0,CHARINDEX('/',@VALUE,0)),
SUBSTRING(@VALUE,
CHARINDEX('/',@VALUE,0)+1,
(CHARINDEX('/',@VALUE,(CHARINDEX('/',@VALUE,0)+1)) -
CHARINDEX('/',@VALUE,0) - 1)
),RIGHT(@VALUE,4)