处理Oracle日期类型与学说DBAL

问题描述:

我已经是比较两个日期已经存在的工作的Oracle SQL:处理Oracle日期类型与学说DBAL

SELECT * FROM table1 WHERE startDate <= TO_DATE(:startDate, 'YYYY-MM-DD'); 

$startDate = DateTime::createFromFormat('Ymd', 20160108); 

正如我所说的,这工作正常。

我试图用Doctrine的查询生成器生成这个查询(或者一个有相同的结果),但我不能得到它的工作。这是我做过什么至今:

$startDate = DateTime::createFromFormat('!Ymd', 20160108); 

$queryBuilder = $connection->createQueryBuilder(); 
$queryBuilder->select('*'); 
$queryBuilder->from('table1'); 
$queryBuilder->where('startDate <= ' . $queryBuilder->createNamedParameter($startDate, \Doctrine\DBAL\Types\Type::DATETIME)); 

以上产生这样的输出:

SELECT * FROM table1 WHERE startDate <= :dcValue1; 
(:dcValue = '2016-01-08 00:00:00') 

而且甲骨文ORA-01861投诉。

在SQLite平台上,这工作正常。任何想法如何正确使它在两个平台上都能正常工作?

当投射一个字符串到日期时,它必须匹配NLS日期格式,或明确格式化。如果您的代码必须在数据库上运行,但您无法确定日期的默认会话格式是什么,请明确指出。作为一般规则,我会说永远是明确的! SELECT * from table1 where start_Date < = TO_DATE(:dcValue1,'yyyy-mm-dd hh24:mi:ss');

在您的查询生成器中,尝试类似这样的操作,但您需要在格式掩码中转义单引号。我相信DBAL是通过加倍报价完成的,但是您需要验证:

$queryBuilder = $connection->createQueryBuilder(); 
$queryBuilder->select('*'); 
$queryBuilder->from('table1'); 
$queryBuilder->where('startDate <= TO_DATE(' . $queryBuilder->createNamedParameter($startDate, \Doctrine\DBAL\Types\Type::DATETIME) . ' ,''yyyy-mm-dd hh24:mi:ss'')'); 
+0

Oracle查询可以正常工作。我试图找出如何从Doctrine的查询生成器生成它。 – Zorrocaesar

+0

增加了一些可能会指向正确方向的东西。然而,我并不是所有那些熟悉DBAL的家庭,所以一起玩,看看它在哪里得到你 –

+0

你仍然没有得到它。 TO_DATE是Oracle特定的功能。如果我在查询生成器中编写它,它将在Oracle以外的任何平台上失败。我需要用所有平台兼容的东西来替代它。 – Zorrocaesar