SQL中的日期问题

时间:2014-04-16 18:13:34

标签: sql sql-server

我在SQL查询中遇到日期问题。我想要一个选择查询,其中一个日期比另一个日期更远,所以这就是我开始使用的日期:

SELECT * FROM TableA WHERE (DATE1 < DATE2);

这返回了一些非常不一致的结果。我认为问题在于日期为NVARCHAR(),格式为21/09/2006 13:28:06,并且已经读到日期未以DATETIME格式存储可能会遇到困难。

然后我尝试了这个

SELECT * 
FROM Table A 
WHERE (CAST(DATE1 AS DATETIME) < CAST(DATE2 AS DATETIME))

不幸的是,这给我留下了以下错误:

  

从字符串

转换日期和/或时间时转换失败

在尝试研究此错误时,我遇到了一个潜在的解决方案

SELECT * 
FROM Table A 
WHERE (CONVERT(DATETIME,DATE1,112) < CONVERT(DATETIME,DATE2,112))

但是我得到了这个错误:

  

将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值

有人可以告诉我这两种方法中的任何一种方法或其他方法都会出错,我会很感激。

非常感谢

2 个答案:

答案 0 :(得分:2)

默认DATETIME格式如下:

  

yyyymmdd HH:MM:SS

您应该使用CONVERT(DATETIME,DATE1,103)

或者我原来的脏解决方案,如果不支持您的格式,这可能很方便:

目前您的格式为mm/dd/yyyy HH:MM:SS,因此您需要做的就是创建一些转化:

SUBSTRING(DATE1, 7, 11) + SUBSTRING(DATE1, 1, 2) + 
   SUBSTRING(DATE1, 4, 6) + SUBSTRING(DATE1, 12, 20)

所以最后:

 CAST((SUBSTRING(DATE1, 7, 11) + SUBSTRING(DATE1, 1, 2) + SUBSTRING(DATE1, 4, 6) + SUBSTRING(DATE1, 12, 20)) AS DATETIME)

会给出你想要的结果。

答案 1 :(得分:0)

您的表格中可能还包含无法转换的错误数据。这就是为什么你永远不应该在varchar或nvarchar字段中存储日期,因为它允许输入错误的日期。当您使用不是标准美国日期格式的日期时,它尤其复杂。因为您使用的是非美国格式,所以了解尝试转换各种格式时会得到的结果以及为什么某些值无法正常工作非常重要。

运行以下查询,看看您是否可以开始了解正在发生的事情以及如何正确转换数据。

create table #temp (textdate varchar(50), realdate datetime)

insert into #temp(textdate)
values ('20140709'),('ASAP'),('01/13/2013') , ('21/09/2006 13:28:06')

select * from #temp
update #temp
set realdate = textdate
where textdate = '20140709'

update #temp
set realdate = textdate
where textdate = '01/13/2013'


update #temp
set realdate =textdate
where textdate ='21/09/2006 13:28:06' 

update #temp
set realdate =CONVERT(DATETIME,textdate,103)
where textdate ='21/09/2006 13:28:06' 

update #temp
set realdate = textdate
where textdate = 'ASAP'

update #temp
set realdate = null

SET DATEFORMAT dmy;

update #temp
set realdate = textdate
where isdate(textdate) = 1

select * from #temp

请注意,转换输入类型的功能可能不适用于其他条目。如果你确定所有都是dmy格式(或者是无法识别的stardard ymd),那么set dateformat语句可以帮助你。但是,如果您的值为混合日期格式或值不是上述示例中的“ASAP”之类的值,那么它将不起作用。其他值可能不会以您的格式'30 / 02/2014'进行转换。它看起来像一个日期,但是即使在闰年,2月也没有30天。这样的数据很容易进入一个varchar字段,它不会像日期字段那样拒绝输入。很可能你需要清理一些数据根本不是日期。根据您的需求和日期字段的用途以及是否需要数据,您可能需要让某人找到实际日期并修复数据,或者您可能只需要null在那里存放不是日期的东西。