【发布时间】:2016-12-24 13:28:28
【问题描述】:
我继承了一个 T-SQL 表,其中 Start_Date 和 End_Date 列是 nvarchar 数据类型。我需要选择开始日期早于该日期但结束日期晚于该日期的特定日期的所有记录。
另一个问题是有些人仍然是最新的并且没有end_date。可悲的是,我不能只将列的数据类型转换为日期。我想用 VBA 写这个,因为
- 我的老板懂 Excel,而且
- 他正在做的报告必须以 Excel 格式发送
例如:
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
如果我选择的日期是 8/15/2015,我返回的数据应该是
Name Start_Date End_Date
Joe 12/1/2014 6/15/2016
Jon 1/27/2015 12/18/2015
Tim 8/28/2013
我尝试了以下查询,但它们返回 Run-time error -2147217900 (80040e14) Automation error
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'
编辑: 我正在使用以下代码来构建我的查询:
For intYear = Year(Now()) To 2012 Step -1
For intMonth = 12 To 1 Step -1
FirstDayOfMonth = DateSerial(intYear, intMonth, 1)
LastDayOfMonth = DateSerial(intYear, intMonth + 1, 0)
SQL = "SELECT NAME FROM dbo.INFORMATION " & _
"WHERE CONVERT(DATETIME, START_DATE, 101) <= " & FirstDayOfMonth & " AND " & _
"CASE END_DATE WHEN '' THEN GETDATE() " & _
"ELSE CONVERT(DATETIME, END_DATE, 101) END >= " & LastDayOfMonth
Debug.Print SQL
'Output:
'SELECT NAME FROM dbo.INFORMATION WHERE CONVERT(DATETIME, START_DATE, 101)
'<= 12/1/2016 AND CASE END_DATE WHEN '' THEN GETDATE() ELSE
'CONVERT(DATETIME, END_DATE, 101) END >= 12/31/2016
Set rs = cn.Execute(SQL)
Next intMonth
Next intYear
更新 2:
我将SQL 设置为文字查询,而不是动态生成它并进行错误捕获(我早就应该这样做了)。我认为在日期周围加上单引号会导致它成为字符串而不是日期,但我尝试了两种方式。
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"
无论有无单引号,SSMS 的实际 SQL 错误都是:
Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.
查看表中的数据,我可以看到有些日期是NULL,有些是空白,有些是mm/dd/yy(甚至是m/d/yy)。我希望 SQL 来完成所有繁重的工作,但现在我正在尝试确定 SELECT * 是否会更难并在 Excel 中处理它,或者让我的老板、他的同事和我的老板来“修复”表格.
【问题讨论】:
-
在您的 VBA SQL 构造字符串中,您可能需要在日期文字周围添加单引号字符,并可能在日期值上使用格式函数以确保将 VBA 日期正确格式化为 ' mm/dd/yyyy' 字符串。
标签: sql sql-server vba sql-server-2008 date