我想在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
。
唯一常见的是由/
分隔的数据。如何使用分隔符分隔此列?
令人惊讶的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等一样的条目。
您永远不应将日期值存储为字符串。
你可以通过使用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
你可以在这里略微滥用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日,具体取决于您的区域设置。
您可以在SQL中使用CharIndex和Substring函数的组合来基于分隔符拆分字符串。
您可以在这里查看CharIndex示例SQL Server 2005 Using CHARINDEX() To split a string和SQL Server - find nth occurrence in a string
假设您的数据库列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?。
试试这个:
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)