首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于数据算术和比较的可移植SQL

用于数据算术和比较的可移植SQL
EN

Stack Overflow用户
提问于 2011-02-15 20:39:30
回答 3查看 839关注 0票数 5

SQL

用于存储用户会话的表:

代码语言:javascript
运行
复制
CREATE TABLE sessions (
    user_id INT,
    expires TIMESTAMP
);

若要创建一个会话:

代码语言:javascript
运行
复制
INSERT INTO sessions (user_id, expires) VALUES (:user_id,
    CURRENT_TIMESTAMP + INTERVAL '+15 minutes');

要检索会话:

代码语言:javascript
运行
复制
SELECT * FROM sessions WHERE user_id = :user_id AND
    CURRENT_TIMESTAMP < expires;

问题

  • 这是可移植的SQL吗? 这是否适用于通过PHP PDO扩展 (不包括SQLite)提供的任何数据库?
  • 这在不同的时区是正确的吗?穿过夏令时调整? CURRENT_TIMESTAMP (包括时区信息)与TIMESTAMP列(不包括时区信息)是否有问题?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-15 21:29:19

在我的经验中,日期/时间值在SQL方言中是相当有问题的。

  • Oracle支持DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE
    • DB2支持日期、时间和时间戳。
    • Server支持日期时间和(最近)日期。Server有一个TIMESTAMP数据类型,但它不是您所认为的那样。
    • MySQL支持日期、日期、时间戳、时间和年份。
    • PostgresSQL支持时间戳和时间,同时支持带时区和不带时区以及日期。

如果我必须以绝对可移植的方式处理日期/时间值,我将以char/varchar的形式以ISO8601紧凑的形式存储该值。

代码语言:javascript
运行
复制
YYYYMMDDTHHMMSS[±HH:MM]

其中时间分量为24小时/军事时间。如果您需要时区支持,请包括来自UTC的偏移量,或表示Zulu (UTC)时间的“Z”。严格地说,如果没有“Z”后缀,则ISO 8601日期/时间值应该被解释为本地时间。

根据您的需要,将日期和时间组件划分为单独的列可能是值得的。

ISO8601给你

  • 便携性
  • 适当的核对/比较
  • 易于分析
票数 3
EN

Stack Overflow用户

发布于 2011-02-15 21:28:10

虽然是标准SQL,但有些DBMS (如Server)不支持标准。所以答案是“是”和“否”。

尽管我认为ANSI标准的编写间隔文字的方法是:INTERVAL '15' MINUTE,而不是您编写它的方式

票数 2
EN

Stack Overflow用户

发布于 2011-02-15 21:15:42

Server不支持此功能。您必须使用dataadd函数。所以答案是否定的--这不是可移植的SQL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5009246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档