Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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查询_Sql_Excel_Vba_Oracle_Date - Fatal编程技术网

使用两个日期的SQL查询

使用两个日期的SQL查询,sql,excel,vba,oracle,date,Sql,Excel,Vba,Oracle,Date,当下面的SQL查询包含一个日期时,我可以运行它。当我引入第二个日期时,不会返回结果 我还使用了DD/MM/YY格式实现了这一点,但只有一个日期 我正在使用Office 2010并连接到Oracle SQL数据库 将cnn设置为新的ADODB.连接 将rst设置为新ADODB.Recordset Dim ConnectionString作为字符串 作为字符串的Dim StrQuery ConnectionString=SQLConnect'这是一个解析为连接字符串的函数 开放连接字符串 cnn.C

当下面的SQL查询包含一个日期时,我可以运行它。当我引入第二个日期时,不会返回结果

我还使用了
DD/MM/YY
格式实现了这一点,但只有一个日期

我正在使用Office 2010并连接到Oracle SQL数据库

将cnn设置为新的ADODB.连接
将rst设置为新ADODB.Recordset
Dim ConnectionString作为字符串
作为字符串的Dim StrQuery
ConnectionString=SQLConnect'这是一个解析为连接字符串的函数
开放连接字符串
cnn.CommandTimeout=180
StrQuery=“从日期>20年5月10日和20年5月13日”的记录中选择ref,date”
打开StrQuery,cnn
此工作簿.Sheets(“Sheet 1”).Range(“A2”).CopyFromRecordset rst
rst.关闭
有线电视新闻网,结束
我尝试将查询修改为“从记录中选择noteno,transdate,其中日期介于'10-MAY-20'和'13-MAY-20'之间”

当使用单个日期时,这两个查询都在Oracle SQL Developer中工作

当通过VBA运行时,“select noteno,trandate from records,where date,比如“%MAY-20”也不起作用(但在Oracle SQL developer中可以)

其中日期>20年5月10日和日期<20年5月13日

'10-MAY-20'
不是日期,而是字符串。日期没有任何格式,根据特定于语言环境的NLS设置,它将使用
TO_CHAR
和适当的格式掩码以可读格式显示

此外,你应该避免使用两位数的表示年份的
YY
,这是Y2Kbug开始的全部原因。始终使用
YYYY
格式

要将字符串转换为日期,请执行以下操作:

使用
更新日期
和适当的格式掩码:

where  date_col > TO_DATE('10-MAY-2020', 'DD-MON-YYYY')  
and    date_col < TO_DATE('13-MAY-2020', 'DD-MON-YYYY')
另一件事,
DATE
是Oracle保留字,您可以看到。可能您正在使用带引号的标识符
“date”
,即在保留字周围使用双引号

我不明白为什么不使用“5月10日-20”,因为这是Oracle SQL developer中所需的格式

这可能是因为SQL Developer的NLS设置设置为
'DD-MON-YY'
,因此当您以该格式传递日期时,它不会隐式转换为日期。但是,如果更改格式,它将不起作用:

alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD';

日期不是字符串,如果处理表示日期的字符串,则由驱动程序或数据库将其解释为日期。Oracle希望有一个TO_DATE-函数,对于SQL server,如果使用正确的格式,您可以编写它而不使用函数。对于其他数据库,可能会有所不同

我一直主张使用
ADODB.Parameter
传递参数。这意味着要编写更多的代码,但在参数格式化(字符串、浮点数等也是如此)和防止SQL注入方面没有更多麻烦。您需要为传递到数据库的每个参数创建一个
ADODB.Command
对象和一个
ADODB.Parameter
。在查询中,只需将参数值替换为

dim d1 as Date, d2 as Date    
d1 = CDate("2020-05-10")   ' Control of the date is completely in your hand.
d2 = CDate("2020-05-13")

StrQuery = "select  ref, date from records  where  date > ? And date < ?"
' Create command
Dim cmd as New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = StrQuery 

' Create 2 parameter of type Date and pass the date values
Dim param as ADODB.Parameter
Set param = cmd.CreateParameter("p1", adDate, adParamInput, , d1)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("p2", adDate, adParamInput, , d2)
cmd.Parameters.Append param

Set rst = cmd.Execute
尺寸d1为日期,d2为日期
d1=CDate(“2020-05-10”)“日期的控制权完全掌握在您手中。
d2=CDate(“2020-05-13”)
StrQuery=“从日期>和日期<的记录中选择ref,date”
'创建命令
Dim cmd作为新的ADODB.Command
设置cmd.ActiveConnection=cnn
cmd.CommandText=StrQuery
'创建2个日期类型的参数并传递日期值
作为ADODB.参数的Dim参数
Set param=cmd.CreateParameter(“p1”,adDate,adParamInput,d1)
cmd.Parameters.Append参数
Set param=cmd.CreateParameter(“p2”,adDate,adParamInput,d2)
cmd.Parameters.Append参数
设置rst=cmd.Execute

日期不能小于20年5月10日,同时不能大于20年5月13日,如果您需要介于两者之间的日期,请切换您的
符号。如果您指的是所有不在这两者之间的日期,则您的
必须是
•还要确保您的日期具有正确的格式,您可能需要将其更改为
2020-05-10
(取决于您的设置,请检查)。
date
没有任何格式,是特定于语言环境的
NLS设置
具有以字符串形式显示日期的格式<代码>'10-MAY-20'不是日期,而是字符串。您必须使用
TO_DATE
将其转换为日期。或者,使用ANSI日期文字。此外,停止使用两位数表示年份。这就是Y2K bug开始出现的全部原因。@StewartLancaster那里只存在
YYYY-MM-DD
根据。此日期格式是国际通信中唯一不能误解的格式()。格式
YYYY-DD-MM
不存在,也请参见日期是Oracle中的保留字还是
“日期”
?@StewartLancaster checkout Lalit下面的答案。他解释了更多。如果你使用计算机,我会说一个普遍而重要的建议是:确保你使用的唯一日期格式是
yyy-MM-DD
,因为这是世界上唯一一种相同的格式,甚至计算机也不会被误解。如果需要使用其他本地化格式,请仅将其用于显示目的。如果你遵循这条规则,你的生活就会轻松得多。@Pᴇʜ好吧,事实上Oracle比ISO标准更古老,这些Oracle特有的语法是存在的。但是,建议使用全球公认的标准。嗯,没错。我应该说得更准确些,应该说“只要可以,就切换到
YYYY-MM-DD
”:)
dim d1 as Date, d2 as Date    
d1 = CDate("2020-05-10")   ' Control of the date is completely in your hand.
d2 = CDate("2020-05-13")

StrQuery = "select  ref, date from records  where  date > ? And date < ?"
' Create command
Dim cmd as New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = StrQuery 

' Create 2 parameter of type Date and pass the date values
Dim param as ADODB.Parameter
Set param = cmd.CreateParameter("p1", adDate, adParamInput, , d1)
cmd.Parameters.Append param
Set param = cmd.CreateParameter("p2", adDate, adParamInput, , d2)
cmd.Parameters.Append param

Set rst = cmd.Execute