【问题标题】:Datetime interpretation issue日期时间解释问题
【发布时间】:2013-10-17 11:31:12
【问题描述】:

我有以下数据:

StartDate    FinishDate    Details
09/10/2013   11/10/2013    xxx
14/10/2013   13/10/2014    Taking a year off

在编辑此数据时,我要检查的日期范围不重叠。

我正在通过 ado 从访问中运行 SQL 查询来执行此操作;我将输入的日期输入数据库格式(即'mm/dd/yyyy');这是我得到的查询:

SELECT Count(*)
FROM MarkerAbsence 
WHERE PerID = 718 AND 
  ('10/09/2013' BETWEEN StartDate AND FinishDate OR 
   '10/11/2013' BETWEEN StartDate AND FinishDate)

如果数据有效,则返回零记录;但是它不返回 1(是上面列出的第二个记录),因此似乎将 '10/11/2013' 解释为 dd/mm/yyyy 而不是 mm/dd/yyyy。

如果我在 SMO 中这样做:

DECLARE @datevar datetime2 = '31/12/2008';
SELECT @datevar;

我明白了:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

虽然

DECLARE @datevar datetime2 = '12/31/2008';
SELECT @datevar;

返回

2008-12-31 00:00:00.0000000

那么为什么我会遇到这个问题,我该如何解决呢?

【问题讨论】:

  • StartDateFinishDate 字段的数据类型是什么?您正在使用哪个 RDBMS?是 SQL Server 吗?
  • 您确定它匹配的是第二条记录而不是第一条记录吗?我认为 10/09/2013 将介于 10/09/2013 和 10/11/2013 之间。

标签: sql


【解决方案1】:

如果您使用 MS Access 运行查询,则需要使用 # 符号分隔日期,即:#12/31/2008#。如果由于某种原因这不起作用,最好使用'yyyy-mm-dd' 格式的字符串日期,因为它会被识别并且是明确的。

您可能会遇到这个问题,因为 MS 是一家美国公司,而美国使用 mm/dd/yyyy 格式,因此 MS 已将其大部分旧软件默认为尽可能将日期视为这种格式,而您可能所在的国家/地区使用 - 并且您的 PC 的位置设置为使用 - dd/mm/yyy 格式。由于不是所有 MS 的软件都遵循这个规则,所以你有这个问题。

解决方案是使用明确的字符串日期格式,例如:yyyy-mm-ddmmm/dd/yyyydd/mmm/yyyy(其中 mmm 返回三个字母的月份,例如 Dec)。

【讨论】:

  • 感谢您的回答; #s 如果后端是 SQL 服务器,则仅当它是访问时才起作用,但我会玩一下日期格式,看看会发生什么。
  • MS 是一家美国公司,这与它无关 - Access(至少从 2003 年开始)将使用 PC 的区域设置。 SQL Server 应根据您在安装时选择的语言使用适当的格式。
  • 好的,你没有在你的问题上加上 MS-AccessSQL-Server 标签,所以你在谈论“结构化查询语言”中的“SQL”还是作为在“SQL 服务器”中。 yyy-mm-dd 是 ANSI 标准,因此应该被识别。
【解决方案2】:

您正在为日期字符串使用 dd/mm/yyyy 格式。默认情况下,如果不进行显式转换,SQL 将需要 mm/dd/yyyy 或 yyyy-mm-dd 格式的日期字符串。因此,要么更改您的字符串以匹配其中一种格式,要么执行以下操作:

SELECT Count(*)
FROM MarkerAbsence 
WHERE PerID = 718 AND 
  (CONVERT(DATETIME, '10/09/2013', 103) BETWEEN StartDate AND FinishDate OR 
   CONVERT(DATETIME, '10/11/2013', 103) BETWEEN StartDate AND FinishDate)

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多