T-SQL查询帮助

时间:2011-04-09 20:30:00

标签: sql-server tsql

我无法通过以下查询获取查询以返回适当的结果:

  1. 对于指定的特定日期列表,计划结帐的客人group编辑by别墅类型;另外还有他们的计数。
  2. 来宾预订表包含以下包含数据的列:(confirm_no, agent_id, g_name, g_phone)

    预订表包含以下带有数据的列:(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan)

    SELECT g_name, default_villa_type
    FROM guest_reservation, reservation
    WHERE
    guest_reservation.confirm_no = reservation.confirm_no
    AND res_checkout_date = 24/12/2010
    order by default_villa_type, g_name;
    
    SELECT COUNT(*) as total_checking_out
    FROM reservation
    WHERE res_checkout_date = 24/12/2010
    

    该查询不应该有效吗?当我运行它时,我得到NO错误,根本没有返回结果(并且计数为0),并且查看我的表我知道应该有2个客人名称在他们结账当天返回。

    帮助?

6 个答案:

答案 0 :(得分:4)

请记住使用'2010-12-24'等单引号分隔日期文字,并记住日期时间字段会考虑时间。试试这样的事情

WHERE res_checkout_date BETWEEN '2010-12-24' AND '2010-12-24 23:59:59.997'

或者像这样在2010年12月24日获取所有记录,假设res_checkout_date是datetime或smalldatetime字段。

WHERE MONTH(res_checkout_date) = 12 AND DAY(res_checkout_date) = 24 AND YEAR(res_checkout_date) = 2010

答案 1 :(得分:2)

T-SQL正在读错你的日期。日期文字需要格式化为字符串(即'24/12/2010',注意单引号),而日期则表示为整数(即​​24除以12,除以2010)。

所以在你的代码中,你实际做的是:

WHERE
guest_reservation.confirm_no = reservation.confirm_no
AND res_checkout_date = 0

为此,您需要做的就是在日期周围包装单引号。

另请注意,仅指定日期假定您实际意味着:24/12/2010 00:00:00.000,如果结帐日期实际为24/12/2010 00:01:00(即午夜过后一分钟),则不会包含在日期中结果。要计算一天内的所有时间,请执行以下操作:

WHERE
guest_reservation.confirm_no = reservation.confirm_no
AND res_checkout_date >= '24/12/2010' AND res_checkout_date < '25/12/2010'

作为次要的旁注,我建议您使用更简洁的日期格式。如果将数据库移动到具有不同默认语言的服务器上(例如,从日期格式为dd/mm/yyyy的服务器移动到a},则以dd/mm/yyyy格式格式化日期可能会造成混淆并在代码中引入微妙的错误日期格式为mm/dd/yyyy)的服务器。为避免这种情况,我通常使用ANSI SQL日期格式,即yyyy-MM-dd HH:mm:ss,并且不依赖于文化。

答案 2 :(得分:2)

只是一个想法,但你尝试使用DATEDIFF进行日期比较吗?这允许您根据日期比较日期,并忽略时间:

WHERE DATEDIFF(d, '2010-12-24', res_checkout_date) = 0

答案 3 :(得分:1)

您是否尝试过'24/12/2010'中的日期

SELECT g_name, default_villa_type
FROM guest_reservation, reservation
WHERE
guest_reservation.confirm_no = reservation.confirm_no
AND convert(varchar,res_checkout_date,103) = '24/12/2010'
order by default_villa_type, g_name;
编辑:我测试了日期没有'没有结果。当我添加'日期时,它向我展示了一些结果。你是如何运行查询的?

答案 4 :(得分:1)

您需要将日期括在引号中。就像现在一样,你正在做一些与where res_checkout_date = 0类似的事情(你将在12乘12后跳水,到2010年会产生2,然后是2,这会截断为0)

答案 5 :(得分:0)

试试这个:

    SELECT g_name, default_villa_type
    FROM guest_reservation, reservation
    WHERE
    guest_reservation.confirm_no = reservation.confirm_no
    AND res_checkout_date = '24/12/2010'
    order by default_villa_type, g_name;

    SELECT COUNT(*) as total_checking_out
    FROM reservation
    WHERE res_checkout_date = '24/12/2010'