Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将varchar字符串解析为三列:年、月和日_Sql_Sql Server_Parsing - Fatal编程技术网

Sql 如何将varchar字符串解析为三列:年、月和日

Sql 如何将varchar字符串解析为三列:年、月和日,sql,sql-server,parsing,Sql,Sql Server,Parsing,我想解决我格式不好的表的一种方法是将date列解析为三列,之后我可以正确地运行查询。日期格式为2013年12月31日的“ddmmmyyyy” 如何将此字符串解析为三个不同的列—天、月、年 提前感谢DATEPART命令可以为您完成这一任务。例如: select datepart(day, '31DEC2013') select datepart(month, '31DEC2013') select datepart(year, '31DEC2013') 我建议只将日期保留在一列中,并在查询中动态

我想解决我格式不好的表的一种方法是将date列解析为三列,之后我可以正确地运行查询。日期格式为2013年12月31日的“ddmmmyyyy”

如何将此字符串解析为三个不同的列—天、月、年


提前感谢

DATEPART命令可以为您完成这一任务。例如:

select datepart(day, '31DEC2013')
select datepart(month, '31DEC2013')
select datepart(year, '31DEC2013')
我建议只将日期保留在一列中,并在查询中动态使用datepart。

尝试以下方法:

select datepart(day, '31DEC2013') as [day], 
       datepart(month, '31DEC2013') as [month],
       datepart(year, '31DEC2013') as [year]

您正试图将数据从一种错误类型转换到另一种错误类型。它是一个日期值,您应该为它使用适当的数据类型,即date或DATETIME

使用适当的数据类型保存此数据将使您能够访问用于数据操作的许多datetime函数

测试数据 查询 后果
由于要将值存储为字符串,您需要将其转换为DataTime,然后使用DatePart。或者对字符串值使用子字符串

:

:


@midiman请确保使用单引号,而不是双引号。单引号用于字符串。双引号表示列名。请输入日期部分,这是我的错误。我没有包括from条款!我还在学习,我保证!!非常感谢您的帮助。另外,请确保语言为英语-并非所有文化都是12月-12月。请提供日期parts@Lamak:-更新了我和CheeseInPosition的答案。谢谢你的链接:?我认为这样的海报会更有意义,因为他发布了他的格式字符串。请把这些东西拼出来——正如我在帖子中所描述的,因为你可能使用YYYY-Y的确切原因没有达到你的预期,现在,是吗?到目前为止没有人提到的一件事是,当您在varchar字段中存储日期时,字段中出现无效日期的可能性很高。在尝试转换之前,您应该确保所有值都是有效日期。在SQL Server 2012及更高版本中,您可以轻松使用TRY\u convert忽略无法转换的值。在早期版本中,您可能需要首先使用ISDATE来识别它们,并以某种方式防止这些行被认为是一个简单的WHERE子句,这通常不足以避免问题。当然,最好的解决办法是首先停止以这种方式存储这些非日期字符串——使用适当的数据类型来存储日期。这肯定比我要求的要多!非常感谢您的洞察力。快速提问,有没有一种方法可以正确地将该查询的结果插入到格式为日期的新列中@m、 如果DATEPART能够识别字符串的格式,那么当你可以简单地将字符串的月份作为日期时,为什么还要对提取和连接位以及转换结果大惊小怪呢?@AndriyM-silly-me,不知道SQL Server是否将其识别为日期:感谢您指出这一点:我也不知道,但决定在评论之前检查它。实际上,我最初打算建议这种双重转换:CASTCASTString\u Month作为datetime作为date–您会同意,这仍然会简单得多。我认为,与我所做的多次字符串操作相比,仍然将其转换为datetime和date会更好:
DECLARE @TABLE TABLE(String_Month VARCHAR(9))
INSERT INTO @TABLE VALUES 
 ('31DEC2013')
,('26NOV2013')
,('22SEP2013')
,('31DEC2013')
,('31DEC2013')
SELECT CAST(  CAST(DATEPART(YEAR, String_Month) AS VARCHAR(4))  + '-'
            + CAST(DATEPART(MONTH, String_Month)  AS VARCHAR(2))+ '-'
            + CAST(DATEPART(DAY, String_Month)  AS VARCHAR(2)) AS DATE) AS Result
FROM @TABLE
Result
2013-12-31
2013-11-26
2013-09-22
2013-12-31
2013-12-31
select  datepart(DAY, cast([date] as datetime)) as [day], 
        datepart(MONTH, cast([date] as datetime)) as [month],
        datepart(YEAR, cast([date] as datetime)) as [year]
select  SUBSTRING([date], 0, 2) as [day], 
        SUBSTRING([date], 2, 3) as [month],
        SUBSTRING([date], 5, 4) as [year]