使用DATEDIFF指定动态间隔

时间:2017-11-03 16:27:43

标签: sql-server

我有以下代码,它按预期工作。

DECLARE @startdate datetime2 = '2007-05-05';  
DECLARE @enddate datetime2 = '2007-05-04';  
SELECT DATEDIFF(year, @startdate, @enddate);

我现在希望能够使用变量从"年,周,日等转换。所以我尝试了这个,但它没有用。有什么建议吗?

DECLARE @startdate datetime2 = '2007-05-05';  
DECLARE @enddate datetime2 = '2007-05-04';  
DECLARE @interval varchar = 'year'
SELECT DATEDIFF(@interval, @startdate, @enddate);

我得到: Msg 1023,Level 15,State 1,Line 25 为datediff指定的参数1无效。

谢谢,

Raul Gonzalez

3 个答案:

答案 0 :(得分:2)

你必须为此使用动态sql。一旦你开始使用动态sql,你打开自己的SQL注入。这是你如何做到这一点,并保护自己免受SQL注入。 case表达式可能看起来有些奇怪,但是如果你的@interval中有一个不允许的值,那么整个sql字符串将为NULL并且不会对你的数据库造成任何伤害。另请注意,您没有为@interval指定长度。对于变量,默认长度为1,因此它只是'y'而不是您预期的'年'。始终指定变量的比例和精度。

DECLARE @startdate datetime2 = '2007-05-05';  
DECLARE @enddate datetime2 = '2007-05-04';  
DECLARE @interval varchar(10) = 'year'

declare @SQL nvarchar(max)

set @SQL = 'select datediff(' + 
    case @interval when 'year' then 'year'
        when 'week' then 'week'
        when 'days' then 'day'
    end
    + ', @startdate, @enddate)'

exec sp_executesql @SQL, N'@startdate datetime2, @enddate datetime2', @startdate, @enddate

答案 1 :(得分:0)

你可以动态地做到这一点:

{{1}}

答案 2 :(得分:0)

现在让我们说我有以下内容:

while ($query->have_posts()) {
echo $query->the_post();
$id=get_the_id();

$imagen_ruta = get_post_custom_values($img = 'main_image');

$imagen = explode(",", $imagen_ruta[0]); 

echo "<img style='width:200px; height:300px;' src='". 
wp_get_attachment_url($imagen[0])."'>";

$nombre= get_post_custom_values($name = '_job_title');

$precio_1hora = get_post_custom_values($hora = '_precio_1hra');

echo " <br>".$nombre[0]." ".$precio_1hora[0];

$lugar_trabajo= get_post_custom_values($key = '_job_location');

echo " <br>".$lugar_trabajo[0];

echo "</div><br>";
}

结果是“12”

现在我希望将12个值显示为:

2017年11月3日

2017年12月3日

2018年1月3日

2018年2月3日

2018年3月3日

2018年4月3日

2018年5月3日

2018年6月3日

2018年7月3日

2018年8月3日

2018年9月3日

2018年10月3日