【问题标题】:Converting Date column to ODBC canonical format in SQL Server 2005在 SQL Server 2005 中将日期列转换为 ODBC 规范格式
【发布时间】:2017-11-06 08:56:29
【问题描述】:

我正在处理在我的 Microsoft SQL Server 2008 中将日期列转换为 ODBC 规范格式的问题。

我在 php 中有以下 SQL 查询:

$sql_query = "UPDATE [$connectionInfo[Database]].[dbo].[log_record] SET [lock]='0' WHERE CONVERT [Date] = '".json_encode($value['Date']['date'])."'

基本上,'".json_encode($value['Date']['date'])."' 部分工作并打印为'"2017-06-01 00:00:00"'。但问题出在 [Date] 列。我该如何比较它们?它会产生以下错误:

错误:转换日期和/或时间时失败 字符串。查询:更新 [dba_sql].[dbo].[log_record] SET [lock]='0' WHERE [Date] = '"2017-06-01 00:00:00"'

我尝试了以下方法,但徒劳无功:

$sql_query = "UPDATE [$connectionInfo[Database]].[dbo].[log_record] SET [lock]='0' WHERE CONVERT CONVERT(varchar, Date, 120) = '".json_encode($value['Date']['date'])."'

【问题讨论】:

    标签: php sql sql-server sql-server-2008 date


    【解决方案1】:

    去掉双引号,删除代码中的convert。无需将表格中的date 转换为字符类型进行比较。

    以下有效:select convert(date,'2017-06-01 00:00:00')

    这不是:select convert(date,'"2017-06-01 00:00:00"')

    rextester 演示:http://rextester.com/NUNAD13593


    另请注意:SQL Server 中日期/时间文字的唯一真正安全的格式,至少对于 datetimesmalldatetime,是:YYYYMMDDYYYY-MM-DDThh:mm:ss[.nnn]

    参考:Bad habits to kick : mis-handling date / range queries - Aaron Bertrand

    例如,如果您的语言设置将dateformat 隐式设置为dmy,那么两次不同转换的相同输入可能会产生不同的输出,如果不是错误的话:

    set language 'british';
    select toDatatype = 'datetime' ,val = convert(char(10),convert(datetime,'2017-06-01 00:00:00'),120)
    union all
    select toDatatype = 'date', val = convert(char(10),convert(date,'2017-06-01 00:00:00'),120)
    

    返回:

    +------------+------------+
    | toDatatype |    val     |
    +------------+------------+
    | datetime   | 2017-01-06 |
    | date       | 2017-06-01 |
    +------------+------------+
    

    select convert(datetime,'2017-06-13') 将返回错误,而select convert(date,'2017-06-13') 将返回2017-06-13

    【讨论】:

    • 我试过了,还是不行。这是我的尝试: $sql_query = "UPDATE [$connectionInfo[Database]].[dbo].[form_record] SET [lock]='0' WHERE CONVERT(Date,'2017-06-01 00:00:00') = '".json_encode($value['Date']['date'])."' AND [form_name]='".$value['form_name']."' AND [I/O#]='" .$value['I/O#']."' AND [facility]='".$value['facility']."'";
    • @Andrew 这不是我的建议。你的错误是WHERE [Date] = '"2017-06-01 00:00:00"'。看到那里的日期周围的那些双引号吗?摆脱那些。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2013-10-14
    • 2014-09-05
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多