当日期存储为nvarchar时,选择日期范围之间的所有数据的SQL
我继承了一个T-SQL表,其中的当日期存储为nvarchar时,选择日期范围之间的所有数据的SQL,sql,sql-server,vba,sql-server-2008,date,Sql,Sql Server,Vba,Sql Server 2008,Date,我继承了一个T-SQL表,其中的Start\u Date和End\u Date列是nvarchar数据类型。我需要选择某一天的所有记录,这些记录的开始日期在该日期之前,但结束日期在该日期之后 另一个问题是,有些人仍然是最新的,没有结束日期。遗憾的是,我不能将列的数据类型转换为日期。我试图用VBA写这个,因为 我的老板懂Excel,而且 他正在做的报告必须以Excel格式发送 例如: Name Start_Date End_Date Joe 12/1/2014 6/15
Start\u Date
和End\u Date
列是nvarchar
数据类型。我需要选择某一天的所有记录,这些记录的开始日期在该日期之前,但结束日期在该日期之后
另一个问题是,有些人仍然是最新的,没有结束日期。遗憾的是,我不能将列的数据类型转换为日期。我试图用VBA写这个,因为
Name Start_Date End_Date
Joe 12/1/2014 6/15/2016
Bob 8/28/2013 6/5/2014
Jon 1/27/2015 12/18/2015
Tim 8/28/2013
如果我选择的日期是2015年8月15日,我返回的数据应该是
Name Start_Date End_Date
Joe 12/1/2014 6/15/2016
Jon 1/27/2015 12/18/2015
Tim 8/28/2013
我尝试了以下查询,但它们返回运行时错误-2147217900(80040e14)自动化错误
SELECT NAME
FROM INFORMATION
WHERE CONVERT(datetime, START_DATE, 101) >= '12/1/2015'
AND CONVERT(datetime, END_DATE, 101) <= '12/31/2015'
SELECT NAME
FROM INFORMATION
WHERE START_DATE >= '12/1/2015'
有单引号和无单引号时,SSMS的实际SQL错误为:
Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.
看看表中的数据,我可以看到一些日期是空的,一些是空的,还有一些是mm/dd/yy(甚至是m/d/yy)。我想让SQL来完成所有繁重的工作,但现在我正试图确定是否更难
选择*
并在Excel中处理它,或者让我的老板、他的同事和我的老上司来“修复”表格。你需要切换>=和你需要切换>=并抓住=
和这是一个VBA错误,不幸的是,我对VBA一无所知。您有权直接查询SQL吗?我建议您通过SQL Management Studio确认查询是否有效,然后更改VBA代码以执行一些简单的操作,例如从信息中选择前10名,我猜您将得到相同的错误,因为它可能与任何特定的SQL查询无关。如果我的数据更干净,您的查询将非常棒。你们知道我怎么处理日期的变化吗?哎呀。是的,理想情况下,您可以修复数据。一种简单的方法是以正确的格式将其复制到新表中,然后从新表中进行选择。你还是保留那张旧桌子,以防出差错。另一个选项是表上的视图,在视图中,您使用一组case语句固定日期(基本上,如果是mm/dd/yyyy,则使用101进行转换,如果mm/dd/yy使用1,等等)。看见通过这种方式,VBA查询很简单,视图是一次性的复杂项。有趣的花絮:其中一个日期是9/2/605(我确定它应该是9/2/05或可能是06)。VBA认为这是一个有效的日期,可以很好地使用它。但是,如果您试图将该值插入格式为日期的单元格,Excel将崩溃。这是一个VBA错误,很好地抓住了=
和这是一个VBA错误,不幸的是,我对VBA一无所知。您有权直接查询SQL吗?我建议您通过SQL Management Studio确认查询是否有效,然后更改VBA代码以执行一些简单的操作,例如从信息中选择前10名,我猜您将得到相同的错误,因为它可能与任何特定的SQL查询无关。如果我的数据更干净,您的查询将非常棒。你们知道我怎么处理日期的变化吗?哎呀。是的,理想情况下,您可以修复数据。一种简单的方法是以正确的格式将其复制到新表中,然后从新表中进行选择。你还是保留那张旧桌子,以防出差错。另一个选项是表上的视图,在视图中,您使用一组case语句固定日期(基本上,如果是mm/dd/yyyy,则使用101进行转换,如果mm/dd/yy使用1,等等)。看见通过这种方式,VBA查询很简单,视图是一次性的复杂项。有趣的花絮:其中一个日期是9/2/605(我确定它应该是9/2/05或可能是06)。VBA认为这是一个有效的日期,可以很好地使用它。然而,如果您试图将该值插入格式为日期的单元格,Excel将崩溃。在VBA SQL构造字符串中,您可能需要在日期文字周围添加单引号字符,并可能对日期值使用format函数,以确保VBA日期正确格式为“mm/dd/yyyy”字符串。在VBA SQL中构造字符串您可能需要在日期文字周围添加单引号字符,或者对日期值使用format函数,以确保VBA日期正确格式化为“mm/dd/yyyy”字符串。
SQL = "SELECT EMPLOYEE_NAME FROM dbo.INFORMATION " & _
"WHERE CONVERT(DATETIME, START_DATE, 101) <= 12/01/2016 " & _
"AND CASE END_DATE " & _
"WHEN '' THEN GETDATE() " & _
"ELSE CONVERT(DATETIME, END_DATE, 101) " & _
"END >= 12/31/2016"
Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.
SELECT Name
FROM dbo.INFORMATION
WHERE CONVERT(DATETIME, Start_Date, 101) <= @targetdate
AND CONVERT(DATETIME, End_Date, 101) >= @targetdate
SELECT Name
FROM dbo.INFORMATION
WHERE CONVERT(DATETIME, Start_Date, 101) <= @targetdate
AND CASE End_Date
WHEN '' THEN GETDATE()
ELSE CONVERT(DATETIME, End_Date, 101)
END >= @targetdate
SELECT Name
FROM dbo.INFORMATION
WHERE @targetdate BETWEEN CONVERT(DATETIME, Start_Date, 101)
AND CASE End_Date
WHEN '' THEN GETDATE()
ELSE CONVERT(DATETIME, End_Date, 101)
END