Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 server M/D/YYYY h:mm tt到DATETIME SQL Server_Sql Server_Date_Datetime - Fatal编程技术网

Sql server M/D/YYYY h:mm tt到DATETIME SQL Server

Sql server M/D/YYYY h:mm tt到DATETIME SQL Server,sql-server,date,datetime,Sql Server,Date,Datetime,我正在尝试在sql server中将字符串date转换为datetime数据类型。这个问题是在不同的论坛上提出的,但是我的情况有点不同 这些是字符串日期的可能性 tt= AM or PM M/D/YYYY h:mm tt M/DD/YYYY h:mm tt MM/D/YYYY h:mm tt MM/DD/YYYY h:mm tt M/D/YYYY hh:mm tt M/DD/YYYY hh:mm tt MM/D/YYYY hh:mm tt MM/DD/YYYY hh:mm tt 但是没有给出

我正在尝试在sql server中将字符串date转换为datetime数据类型。这个问题是在不同的论坛上提出的,但是我的情况有点不同 这些是字符串日期的可能性

tt= AM or PM M/D/YYYY h:mm tt M/DD/YYYY h:mm tt MM/D/YYYY h:mm tt MM/DD/YYYY h:mm tt M/D/YYYY hh:mm tt M/DD/YYYY hh:mm tt MM/D/YYYY hh:mm tt MM/DD/YYYY hh:mm tt 但是没有给出任何解释,不同的是我试图对字符串中的秒进行相同的转换。当我运行该代码时,我得到一个错误,因为右整数函数不正确。
任何帮助/解释都将非常有用

正在进行字符串操作,以将其转换为公认的ISO标准格式。如果不这样做,由于不同的文化使用不同的日期格式,在混淆日期和月份时执行CAST/CONVERT可能会犯错误。例如,2015年12月2日可能代表12月2日或2月12日

提供的答案将创建ISO格式的字符串“YYYY-MM-DD HH:MM:ss”。
SELECT
后面的第一行提取年份并附加连字符,其后的一行提取月份和连字符,依此类推。我假设你在那篇文章中发现了OP指出了公认答案中的错误的部分

我假设您知道每个函数的功能(如果不知道,可以在MSDN上搜索定义-现在就这样做,否则下面的内容就没有意义了)。但是,当这些函数一起使用时,它可能有助于解释解决方案中使用的一些模式

CHARINDEX('/',REVERSE(notADateTime))
从后面到前面查看字符串,并找到第一个
/
(由于字符串是向后的,所以这是最后一个
/
)。因此,当与“RIGHT”一起使用时,
RIGHT(notADateTime,CHARINDEX(“/”,REVERSE(notADateTime))-1)
将返回字符串的右端,位于最后一个
/
之后

RIGHT('00'+*value*,2)
用于确保某些值(如小时、分钟、天和月)有两位数字。2表示他们需要最后两个字符(这是数字,因为这是一个数字)。请注意,“00”只需要是“0”,因为任何整数总是已经有一个数字

一旦它是这种格式,就把它包装成一个CAST to DATETIME2,这样它就不再是字符串了


现在你明白了,你应该可以自己尝试解决这个问题。请记住,解决方案需要秒数,而字符串没有秒数。如果您需要更多帮助,请通过添加评论告知我。

无法将其转换为datetime?还可以看到:我想我需要更多地查看数据@McNets我能够在一些数据上使用cast函数,它起作用了。当我转换整个表数据时,我得到了一个超出范围的值。@huzaifamamir然后您现在明白了为什么将日期时间值存储为字符串是一个糟糕、非常糟糕的主意。这允许垃圾进入数据库,这只会给有效地查找、清除、更正或忽略带来麻烦;但是看起来你链接的答案有秒,而这个问题的标题没有秒,所以我认为“with”是一个拼写错误,应该是“without”。不,这肯定有帮助。我将把这标记为正确答案。非常感谢。感谢你没有给我答案,而是提供了一个解释
    DECLARE @formats TABLE (notADateTime VARCHAR(30))
INSERT INTO @formats (notADateTime) VALUES 
('1/1/2015 1:01:12 AM'), ('1/01/2015 1:12:12 PM'), ('12/2/2015 1:11:12 AM'), ('08/13/2015 1:22:44 PM'),
('1/1/2015 10:01:11 PM'),('1/01/2015 10:12:12 AM'),('12/2/2015 12:5:12 AM'),('08/13/2015 01:44:55 AM')

SELECT *,
LEFT(RIGHT(notADateTime,CHARINDEX('/',REVERSE(notADateTime))-1),4) + '-' +
RIGHT('00'+LEFT(notADateTime,CHARINDEX('/',notADateTime)-1),2) + '-' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX('/',notADateTime)+1,2),'/',''),2) + ' ' +
RIGHT('00'+CAST(CASE WHEN RIGHT(notADateTime,2) = 'PM' THEN 12 ELSE 0 END + RIGHT('00'+REPLACE(LEFT(notADateTime,CHARINDEX(':',notADateTime)-1),' ','0'),2) AS VARCHAR),2) + ':' +
RIGHT('00'+REPLACE(SUBSTRING(notADateTime,CHARINDEX(':',notADateTime)+1,2),':',''),2) + ':' +
REVERSE(LEFT(RIGHT(notADateTime,CHARINDEX(':',REVERSE(notADateTime))-1),2))
  FROM @formats