【问题标题】:Datetime acting weird on different computers日期时间在不同的计算机上表现得很奇怪
【发布时间】:2015-07-30 13:39:09
【问题描述】:

我正在尝试制作一个在 SQL Server 上执行一些查询的程序,由于某种原因,代码有奇怪的行为,因为它会在我的两台计算机上创建不同的日期值。

这是代码行为怪异的部分。

Query += " dbo.MensajesProcesados.SentDateTime BETWEEN CONVERT(VARCHAR, '" + FechaInicio.Value.ToUniversalTime().ToShortDateString() + "', 103) AND CONVERT(VARCHAR, '" + FechaFin.Value.ToUniversalTime().ToShortDateString() + "', 103)";

在第一台计算机(工作)给我:

BETWEEN CONVERT(VARCHAR, '5/18/2015', 103) AND CONVERT(VARCHAR, '5/19/2015', 103)

以及第二台不工作的计算机:

BETWEEN CONVERT(VARCHAR, '17/05/2015',103) AND CONVERT(VARCHAR, '19/05/2015',103)

这个不工作,会输出以下错误

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

拜托,任何帮助都会很棒!

【问题讨论】:

  • 如果你停止连接你的 SQL 而是使用参数,这些问题就不会存在。而且,作为一项额外功能,您的代码不会对 SQL 注入开放。
  • 您在问题中显示了 2 种不同的日期格式,但您没有向转换器指定要使用的格式(在提供的示例代码中)。转换函数应该如何知道第一个数字是代表日期时间的月份还是日期?您可以更改转换器使用的格式,或日期时间使用的格式(用于字符串输出),但正确的解决方案是使用参数正确执行 SQL。 SQL 库非常有用,它提供的不仅仅是执行字符串 SQL 语句的简单方法。
  • @KenWhite 问题是如果我不使用连接,我不知道另一种方法来做我需要的事情,因为我有各种搜索参数,如果文本框里面有东西,它会在 where 子句中使用它,否则它不会,你怎么能用 params 来实现呢?
  • 您可以根据需要使用SQLCommand.Parameters.AddWithValue 创建参数。请参阅这些search results,其中应该会出现一些这样做的示例。

标签: c# sql sql-server


【解决方案1】:

Sql Server 提供文化中性格式'yyyyMMdd'

Query += " dbo.MensajesProcesados.SentDateTime
BETWEEN '" + FechaInicio.Value.ToString("yyyyMMdd") + "' 
AND '" + FechaFin.Value.ToString("yyyyMMdd") + "'";

【讨论】:

  • 如果我想增加时间,我猜是这样的,但FechaInicio.Value.ToUniversalTime().ToString("yyyyMMdd") + " " +TimeInicio.Value.ToUniversalTime().ToString("HHmmss") 没用
  • @pato.llaguno,格式化支持:ToString("yyyyMMdd hh:mm:ss")
  • 问题是我在另一个文本框中输入的时间,我找不到在同一个文本框中选择它的方法
【解决方案2】:

这与 SQL Server 的文化/语言有关。见这里:SQL Server Datetime issues. American vs. British?

set language us_english
declare @d datetime = '1929/12/18'

您可以按照问题中的解决方案手动更改语言,或者您可以通过输入月份和年份来构建日期,这样就没有翻译空间了,请在此处查看一些答案:Create a date with T-SQL

DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011
SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)

尝试 CONVERT 而不是 CAST。

CONVERT 允许使用第三个参数来指示日期格式。

【讨论】:

  • DateTimeInstance.ToString("o")(往返格式)是创建 DateTime 的明确字符串表示的可靠方法吗?
  • @SimonCampbell 老实说不确定,因为现在你也在考虑你的编程语言的文化设置。但是你总是可以更明确的安全,例如,在 c# myDateTime.ToString("yyyy-MM-dd HH:mm:ss");
  • 如果他更改 RDBMS 中的语言设置来解决问题,那么以前工作的案例就会中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2020-05-03
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多